java中散列表、樹所對應的的容器類java
散列表:hashmap,hashtable,concurrentHashmap算法
樹:hashset,treemap,treeset數組
jdk7與jdk8中HashMap的區別函數
jdk7中hashMap採用數組+鏈表,若是過多的節點在hash時發生碰撞,若是要查找其中一個節點,須要O(n)的查找時間。對象
jdk7中hashMap採用數組+鏈表/紅黑樹,當某個桶位達到某個閾值時,鏈表將轉化爲紅黑樹,紅黑樹時間複雜度O(nlogn)接口
HashMap如何解決衝突ci
1.開放定址法: 經過探測算法,當一個槽位已經被佔用狀況下繼續查找下一個
2.鏈地址法(數組+鏈表)
3.再哈希 準備多個散列函數,當發生衝突時,再選擇一個散列函數進行散列。get
HashMap的工做原理hash
HashMap 底層是數組和單向鏈表實現,數組中的每一個元素都是鏈表,由 Node 內部類(實現 Map.Entry<K,V>接口)實現,HashMap 經過 put & get 方法存儲和獲取。it
HashCode是定位(存儲位置),equals是定性(二者是否相等)
存儲對象時,將K/V傳給put()方法:
①hash(K)計算K的hash,結合數組長度,計算數組下標
②調整數據大小(當容器中的元素個數大於 capacity * loadfactor 時,容器會進行擴容resize 爲 2n)
③三種狀況:
獲取對象時(get方法):
①調用hash(K),計算K的hash值從而獲取數組的下標
②順序遍歷鏈表,equal方法查找相同 Node 鏈表中 K 值對應的 V 值