java集合學習之Map(一)HashMap

2021-08-15 12:48:08 字數 2722 閱讀 6636

首先,本人鄙視了...........下面開始自己的知識整理

先確定下幾個概念

1.hashmap採用的是陣列加鍊表的形式儲存資料

2.hashmap中有default_initial_capacity(初始化大小,預設為16)default_load_factor(載入因子,預設為0.75f)

3.什麼是hashcode(雜湊碼),個人理解就是,通過某種演算法,盡量讓同乙個類的物件按照自己不同的特徵盡量的有不同的雜湊碼。

4.與運算,1&1=1,其餘為0

正文:從建立乙個hashmap說起,一共有種方法建立乙個物件:

但最終都會呼叫第3個方法,直接從第三個方法開始整理:rt

首先看引數:initialcapacity就是初始化大小,loadfactor就是載入因子,如果呼叫無參的構造方法,這兩個引數的值就是概念的2,看下引數maximum_capacity = 1<<30;就是2的31次方,這是hashmap允許的最大長度。

看下while迴圈,(容量《初始容量),大體看一下構造,從put方法說起,感覺put方法比較容易講解:

首先,如果key==null的話,就呼叫null值方法,put進去。重點在後面,key!=null,計算出key的hashcode值hash,在將hash與table.length-1做與運算

在建構函式中可以看到table的length就等於capacity,在while迴圈中也可以看到,capacity為2的次冪,indexfor方法裡做的是兩者的位運算,即直接通過2進製來運算。整理下現有的資料:capacity:轉換成2進製肯定為1000.....000(就是length),然後length-1=0111..111,我們假定capacity=16轉成2進製就是10000,length-1=01111,所以說無論h為什麼值,都是只有h的後四位和length-1的後四位參與運算,(length-1出了後四位都是0,最後與運算結果還是0)。所以結果只在0-1111之間,保證了最後產生的【i】【該key所對應的entry在陣列中的位置】,只會在table(length=16,0-15)的範圍內。

所以會有乙個問題產生,就是所有的key,最後計算出來的位置肯定都在16個之一。那麼不同的key,不同的hashcode計算出來的【i】可能會一樣【【hash碰撞的問題,hashmap不可避免的問題】】,這就是為什麼需要用鍊錶了,根據hash值去找煉表裡遍歷,找到key。entry結構如下

【h&(length-1)也相當於 h%length,隨便舉個例子就能得出,為什麼用位運算,肯定是速度快了】

為什麼length是2的次冪,不是隨便乙個數,我覺得啊,真的是我覺得,可能是這樣運算方便吧......

【舉個例子:如何length=298,h=315,轉換成2進製,就要每個位數進行計算,當length很大,h也很大時肯定是一種累贅了,雖然位運算確實很快】

但這就涉及到了另乙個問題【負載因子】了。等會再說,mark一下。【ps:負載因子是決定hashmap這個table何時擴充的主宰因素】

看**,for迴圈,我們得到了key在陣列中的位置【i】,和key的hashcode,就要去遍歷看一下有沒有這個key,上邊說到不同的key可能會在同乙個位置,所以我們需要根據key的hashcode去尋找我們要找的那個,如果有就覆蓋掉,如果沒有..就接著走唄,呼叫addentry方法:

我們來解釋下這幾個引數:size就是map的大小就是有多少個鍊錶吧,但並不是陣列的容量。

【threshold,重點說下】在前面兩個引數的建構函式中看到:threshold = (int)math.min(capacity * loadfactor, maximum_capacity + 1); 取 陣列容量*負載因子的值去和2的31次方+1比較取小值,【我們要根據loadfactor去決定何時擴容!!!!】因為map的最大就是2的32次方了。如果當前鍊錶的個數大於負載的個數了,我們就需要擴充和複製了,搞乙個新的陣列出來,重新計算hash值和新的key的位置。看下resize

【負載因子】【預設載入因子 (.75) 是在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本】這就是傳說中的【"時-空"矛盾的平衡與折衷】

再看下createentry

我們就取【i】的entry,然後給建立乙個新的entry把要put的key,value放進去,把【i】的entry放到next,就相當於給鍊錶加頭結點吧。最後重新賦給table【i】。

感謝:  的文件,很有啟發

JAVA 集合之Map介面

map介面 集合框架中的另乙個父介面 map集合 另名為雜湊表 用於儲存一一對應的元素資料,第乙個物件可以作為索引,第二個物件作為值,我們稱之為key value,鍵值對。1 以key value形式進行儲存。2 key與value都必須是引用型別。3 key可以為null。4 key與value是...

JAVA基礎之map集合

mapmap new hashmap 1 對映功能 就是將key對映到value,如果key存在,則覆蓋value,並將原來的value返回,如果key不存在,則返回null。v put k key,v value 例如 map.put 1705030220 張三 map.put 170503022...

Java集合 Map集合

map map 用於儲存具有對映關係的資料,因此 map 集合裡儲存著兩組值,一組值用於儲存 map 裡的 key,另外一組用於儲存 map 裡的 value map 中的 key 和 value 都可以是任何引用型別的資料 map 中的 key 不允許重複,即同乙個 map 物件的任何兩個 key...