中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的集合函數HashMap怎么用

發布時間:2022-01-14 14:15:01 來源:億速云 閱讀:181 作者:iii 欄目:開發技術

本篇內容介紹了“Java的集合函數HashMap怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

概述

以數組+鏈表+紅黑樹實現。主要用來處理具有鍵值對特征的數據。
②當鏈表長度大于閾值(或者紅黑樹的邊界值,默認為 8 )并且當前數組的長度大于 64 時,此時此索引位置上的所有數據改為使用紅黑樹存儲。
補充:將鏈表轉換成紅黑樹前會判斷,即便閾值大于 8,但是數組長度小于 64,此時并不會將鏈表變為紅黑樹,而是選擇逬行數組擴容。
④每個Node節點存儲著用來定位數據索引位置的hash值,K鍵,V值以及指向鏈表下一個節點的Node<K,V> next節點組成。
⑤Node是HashMap的內部類,實現了Map.Entry接口,本質是一個鍵值對。
⑥這樣做的目的是因為數組比較小,盡量避開紅黑樹結構,這種情況下變為紅黑樹結構,反而會降低效率,因為紅黑樹需要逬行左旋,右旋,變色這些操作來保持平衡。同時數組長度小于64時,搜索時間相對要快些。所以結上所述為了提高性能和減少搜索時間,底層閾值大于8并且數組長度大于64時,鏈表才轉換為紅黑樹。

Java的集合函數HashMap怎么用

重要的參數

①容量(Capacity)和負載因子(Load factor
②初始容量:容量是哈希表中桶的個數,初始容量是創建哈希表時的容量。
③負載因子:負載因子是衡量哈希表在自動增加容量之前允許其達到多滿的指標。 默認0.75
④threshold:threshold表示所能容納的鍵值對的臨界值。計算公式為 數組長度 * 負載因子。
⑤size:size是hashmap中實際存在的鍵值對數量。
⑥modCount:用來記錄hashmap內部結構發生變化的次數。

put函數的實現

大致思路:

對key的hashCode()做hash,然后再計算index;
如果沒碰撞直接放到bucket里;
如果碰撞了,以鏈表的形式存在buckets后;
如果碰撞導致鏈表過長(大于等于 TREEIFY_THRESHOLD )就把鏈表轉換成紅黑樹;
如果節點已經存在就替換old value(保證key的唯一性)
如果bucket滿了(超過 load factor*current capacity ),就要resize(調整大小)。

get函數的實現

大致思路:

  • bucket里的第一個節點,直接命中;

  • 如果有沖突,則通過key.equals(k)去查找對應的entry若為樹,則在樹中通過key.equals(k)查找,O(logn);若為鏈表,則在鏈表中通過key.equals(k)查找,O(n)。

hash函數的實現

//高16bit不變,低16bit和高16bit做了一個異或
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

獲取HashMap的元素時,基本分兩步:

  • 1.首先根據hashCode()做hash,然后確定bucket的index;

  • 2.如果bucket的節點的key不是我們需要的,則通過keys.equals()在鏈表(紅黑樹)中找。

RESIZE的實現

當put時,如果發現目前的bucket占用程度已經超過了Load Factor所希望的比例,那么就會發生resize。

Java的集合函數HashMap怎么用

resize的過程,簡單的說就是把bucket擴充為2倍,之后重
新計算index,把節點再放到新的bucket中。元素的位置要么是在原位置,要么是在原位置再移動2次冪的位置。省去了重新計算hash值的時間,把之前的沖突的節點分散到新的bucket了

Java的集合函數HashMap怎么用

什么時候會使用HashMap?他有什么特點?

是基于Map接口的實現,存儲鍵值對時,它可以接收null的鍵值,是非同步的,HashMap存儲著Entry(hash, key, value, next)對象。
** 你知道HashMap的工作原理嗎?**
通過hash的方法,通過put和get存儲和獲取對象。存儲對象時,我們將K/V傳給put方法時,它調用hashCode計算hash從而得到bucket位置,進一步存儲,HashMapJava集合&mdash;&mdash;HashMap會根據當前bucket的占用情況自動調整容量(超過 Load Facotr 則resize為原來的2倍)。獲取對象時,我們將K傳給get,它調用hashCode計算hash從而得到bucket位置,并進一步調用equals()方法確定鍵值對。如果發生碰撞的時候,Hashmap通過鏈表將產生碰撞沖突的元素組織起來,在Java 8中,如果一個bucket中碰撞沖突的元素超過某個限制(默認是8),則使用紅黑樹來替換鏈表,從而提高速度。

你知道get和put的原理嗎?equals()和hashCode()的都有什么作用?

通過對key的hashCode()進行hashing,并計算下標( (n-1) & hash ),從而獲得buckets的位置。如果產生碰撞,則利用key.equals()方法去鏈表或樹中去查找對應的節點。

hash的實現,為什么要這樣實現?

在Java 1.8的實現中,是通過hashCode()的高16位異或低16位實現的: (h =k.hashCode()) ^ (h >>> 16) ,主要是從速度、功效、質量來考慮的,這么做可以在bucket的n比較小的時候,也能保證考慮到高低bit都參與到hash的計算中,同時不會有太大的開銷。

如果HashMap的大小超過了負載因子( load factor )定義的容量,怎么辦?

如果超過了負載因子(默認0.75),則會重新resize一個原來長度兩倍的HashMap,并且重新調用hash方法。

“Java的集合函數HashMap怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山东| 雅江县| 玉田县| 武陟县| 高要市| 佳木斯市| 手机| 万安县| 墨竹工卡县| 甘洛县| 浙江省| 仁化县| 阳城县| 禹州市| 高台县| 佛教| 鞍山市| 弋阳县| 德钦县| 留坝县| 娄烦县| 平遥县| 长宁区| 漳平市| 普兰店市| 嵊州市| 兴和县| 隆化县| 玛沁县| 仁布县| 孟州市| 买车| 十堰市| 凌海市| 甘德县| 泰和县| 镇原县| 普宁市| 宁强县| 宝鸡市| 象山县|