A:HashMap簡單說就是它根據建的hashcode值存儲數據的,大多數情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷的順序是不確定的。
B:HashMap基於哈希表,底層結構由數組來實現,添加到集合中的元素以“key--value”形式保存到數組中,在數組中key--value被包裝成一個實體來處理-也就是上面Map接口中的Entry
C:在HashMap中,Entry[]保存了集合中所有的鍵值對,當我們需要快速存儲、獲取、刪除集合中的元素時,HashMap會根據hash算法來獲得“鍵值對”,在數組中存在的位置,來實現對應的操作方法。
D:HashMap底層采用了數組來維護的,Entry靜態內部類的數組
E:HashMap添加元素:將准備增加到的Map中的對象與該位置上的對象進行比較(equals方法),如果相同那么就將該位置上的那個對象(Entry類型)
的value值替換掉,否則沿着該Entry的鏈繼續重復上述過程,如果到鏈的最后仍然沒有找到與此對象相同的對象,那么這個時候就會被增加到數組中,
將數組中該位置上的那個Entry對象鏈到該對象的后面(先hashcode計算位置,如果找到 相同位置便替換值,找不到則重復hashcode計算,直到最后添加到hashmap最后面)
F:HashMap是基於哈希表的Map接口的非同步實現,允許null鍵值,但不保證映射的順序;底層使用數組實現,數組中的每項是一個鏈表;存儲時根據key的hash算法來決定其存儲位置;數組擴容需要重新計算擴容后每個元素在數組中的位置很耗性能
G:ConcurrentHashMap是HashMap線程安全的實現,允許多個修改操作同時進行(使用了鎖分離技術),它使用了多個鎖來控制對hash表的不同段進行修改,每個段其實就是一個小的hashtable,它們有自己的鎖。使用了多個hash表(段Segment),允許多個讀操作並發進行,讀操作並不需要鎖,因為它的HashEntry幾乎是不可變的。
H:HashmapJDK1.7之前是數組加鏈表;JDK1.8之后 融入了紅黑數,如果鏈表超過8的話 就直接扔樹里,它不是個線程安全的 並發下會出現死鎖問題,也就是鏈表出現相互引用
I:JDK1.8 融入了紅黑數,hash會產生哈希沖突 鏈表會越來越長 找一個數據需要查找 鏈表需要遍歷 查找速度太慢,而且數組的話 會擴容 擴容一次 數據之間會進行深拷貝 hash值又得重新計算