HashMap實現原理

2021-09-13 15:17:17 字數 1201 閱讀 1038

hashmap基於map介面的非同步實現,允許null鍵和null值

此類不保證對映順序,不保證該順序永遠不變

hashmap的資料結構:

鍊錶和陣列的結合體

底層實現是乙個陣列,陣列的每一項就是乙個鍊錶,entry是乙個static class,其中包含key、value以及next,它的key和hash是final的

hashmap在容量總是2的n次方,h&(length-1)相當於對length取模,但是&比%更有效率,hash的計算

h=key.hashcode

h=h^(h>>16)

低位加入高位資訊

hashmap的get方法,沒,首根據hash的key計算hashcode,再根據key的equals方法在對應的鍊錶中找需要的元素

hashmap中元素越來越多的時候,hash衝突機率就會越來越高,為了提高查詢效率,就要對hashmap進行擴容,當hashmap中的元素個數超過陣列大小*loadfactor時,就會進行陣列擴容,loadfactor的預設值為0.75,陣列擴容大小為擴容2倍,負載因子越大,對空間利用更充分,但是查詢效率降低,如果負載因子過小,雜湊表過於稀疏,對空間造成嚴重浪費

hashmap不是執行緒安全的,如果在使用迭代器的過程中,有其他執行緒修改了map,將丟擲concurrentmodificationexception,就是所謂fail-fast策略

hashset實現原理:

它基於hashmap實現的,底層採用hashmap來儲存元素,所以相關hashset的操作都是使用hashmap底層方法,應該將儲存在hashset中的物件覆蓋hashcode和equals。因為hashset中包含的物件都是hashmap中的key,value都是present

hashtable 是乙個雜湊表,內容儲存的內容鍵值對,hashtable繼承於dictionary類,實現了map,hashtable是通過拉鍊法實現雜湊表的

linkedhashmap:

hashmap是無序的

linkedhashmap是hashmap的乙個子類,它保留插入的順序,如果需要輸出和輸入時的順序相同,可以按照插入順序或者訪問順序進行迭代

linkedhashset是通過linkedhashmap來實現的,繼承自hashset,

arraylist可以理解為動態陣列,實現了list介面,

linkedlist 基於鍊錶實現所以類中包含兩個指標,first和last,構成雙向鍊錶

HashMap實現原理

hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...

HashMap實現原理

資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...

HashMap實現原理

public v put k key,v value 如果i索引處的entry為null,表明此處還沒有entry。modcount 將key value新增到i索引處。addentry hash,key,value,i return null 從上面的源 中可以看出 當我們往hashmap中put...