Hashmap的學習理解

2021-09-03 01:52:55 字數 2111 閱讀 7954

一、hashmap的簡介概況

1.hash簡介

hashmap 是乙個雜湊表,它儲存的內容是鍵值對(key-value)對映。hashmap 的實現不是同步的,這意味著它不是執行緒安全的。它的key、value都可以為null。此外,hashmap中的對映不是有序的。

hashmap 的例項有兩個引數影響其效能:「初始容量」 和 「載入因子」,容量 是雜湊表中桶的數量,初始容量 只是雜湊表在建立時的容量。載入因子 是雜湊表在其容量自動增加之前可以達到多滿的一種尺度,通常,預設載入因子是 0.75。

2.hashmap的建構函式

一共有四個建構函式

// 預設建構函式。

hashmap()

// 指定「容量大小」的建構函式

hashmap(int capacity)

// 指定「容量大小」和「載入因子」的建構函式

hashmap(int capacity, float loadfactor)

// 包含「子map」的建構函式

hashmap(map extends k, ? extends v> map)

3.hashmap的api

void              clear()  //清空hashmapobject            clone()    //轉殖乙個hashmap物件並返回

boolean containskey(object key) //判斷hashmap是否包含key

boolean containsvalue(object value) //判斷hashmap是否包含「值為value」的元素

set> entryset() //返回「hashmap中所有entry的集合」,它是乙個集合v get(object key) //獲取key對應的valueboolean isempty()

setkeyset()

v put(k key, v value) //對外提供介面,讓hashmap物件可以通過put()將「key-value」新增到hashmap中void putall(map extends k, ? extends v> map) //將"m"的全部元素都新增到hashmap中v remove(object key) //刪除「鍵為key」元素int size()

collectionvalues()

二、hashmap的資料結構

hashmap與map關係如下圖

從圖中可以看出: 

(01) hashmap繼承於abstractmap類,實現了map介面。map是"key-value鍵值對"介面,abstractmap實現了"鍵值對"的通用函式介面。 

(02) hashmap是通過"拉鍊法"實現的雜湊表。它包括幾個重要的成員變數:table, size, threshold, loadfactor, modcount。

table是乙個entry陣列型別,而entry實際上就是乙個單向鍊錶。雜湊表的"key-value鍵值對"都是儲存在entry陣列中的。 

size是hashmap的大小,它是hashmap儲存的鍵值對的數量。 

threshold是hashmap的閾值,用於判斷是否需要調整hashmap的容量。threshold的值="容量*載入因子",當hashmap中儲存資料的數量達到threshold時,就需要將hashmap的容量加倍。

loadfactor就是載入因子。 

modcount是用來實現fail-fast機制的。

HashMap類的理解

hashmap是乙個雜湊表,它的儲存內容是鍵值對。紫色部分代表雜湊表,每個元素後面都是乙個單鏈表的頭結點。原始碼分析 上面原始碼,hashmap初始容量為 4個,最大容量為2的 30次冪,增長因子為 0.75 在進行擴容時,擴容數量 增長因子 當前容量。第 90行,為對應的 hash 表 hashm...

對於hashmap的理解

對key求hashcode得到的值來選桶 對key求equals,如果相同則覆蓋,不相同則尾插成鍊錶 太長變成紅黑樹 取值的時候是插入的逆過程,通過求傳入的key的hashcode來選桶,桶裡的鍊錶挨個和傳入的key求equals,true則取value,false則繼續找下乙個。之前一直都是這麼理...

HashMap原理的理解

hashmap 首先根據key計算hash值,hashcode右移16位與hashcode異或計算 用hash值不用hashcode值是因為hashcode 32位 太大不方便計算,並且得到答案的概率不均衡。第二步 是根據hash值去計算陣列下標 n 1 hash 用這個不用hash值取餘計算因為二...