目錄
面試中經常會被問道:
面試官:有了解HashMap嗎,講一下HashMap吧~
我:呃呃呃~是這樣的,balabalbala~
蒐集了網上的一些資料,估計也不全,大致也能說明白這個道理,(僅作爲面試參考):
這個事情要從JDK的版本更新說起,話說現在,風雲跌宕,大家都講:我們支持的JDK版本最低爲1.8~
好,這就是一個目前的分界線了。
先翻歷史,再論現在。
HashMap
JDK1.7
這個版本-HashMap的底層使用數組加鏈表實現。根據key計算出數據下標,如果多個key對應到同一個下標,就用鏈表串起來,新插入的放在前面。
JDK1.8
這個版本有了一些變化,底層使用數組+鏈表/紅黑樹來實現的。鏈表長度超過8,就轉紅黑樹,紅黑樹大小小於6就轉回鏈表
key是如何Hash的呢?
// java HashMap
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
不夠我說的,太少了,再來點--好的,滿足你-
-推薦-唐彤--zhisheng(公衆號)--的文章--面試官:HashMap 源碼你都不知道還來面試?
tips:除了這些底層結構,加上get --set--這些方法打出來更好--絕對加分項
ConCurrentHashMap
JDK1.7
在Hashmap的基礎上,把數據分爲了多個segment段,默認16個段,以段來進行加鎖操作,提高併發效率。
JDK1.8
取消了,大部分操作不加鎖了(紅黑樹的鎖依然存在,如不瞭解,懂我意思,此處暫不談論)
不使用Segment分段加鎖控制,轉爲使用Node+CAS+Synchronized來實現,鎖的粒度轉爲HashEntry(首節點)
這些看完覺得不夠,怎麼夠面試說的呢~,這樣有辦法
推薦 廝大 (公衆號-朱小廝的博客)的一篇文章-叫做--爲什麼ConcurrentHashMap的讀操作不需要加鎖?
那你要問HashTable,那這樣,遙遠的從前 java 5開始有了JUC的包,那是已經轉用ConcurrentHashMap而不是HashTable了
好了,給你文章,你自己看吧~
知乎問題: HashMap和Hashtable的區別?