一、HashMap與HashTable的區別
1.來歷
HashTable是一種鍵值映射的數據結構,自從java發布就存在,而HashMap是jdk1.2后才出現的,雖然說HashTable出現得早且線程安全,但是效率很低已經棄用了,現在HashMap逐漸成為主流
2.底層數據結構不同
HashTable底層使用的是數組?鏈表,而HashMap底層則是數組?鏈表+紅黑樹
3.線程安全性不同
HashTable是線程安全的,這是因為在每個方法中加入了Synchronize用來實現線程同步,在多線程并發的情況下直接用HashTable就可以實現線程安全,HashMap則是線程不安全的。
但是使用HashTable效率太低了,這是因為當線程訪問HashTable的同步方法時,其他線程只有堵塞等待占用線程執行完
而HashMap在多線程環境中使用put方法導致形成環形鏈表從而形成死循環,導致線程不安全
這個時候ConcurrentHashMap使用分段鎖,對不同的數據段使用不同的鎖,可以支持多個線程同時訪問不同數據段,這樣既保證了線程安全性也提高了并發效率
4.key和value是否允許null值
HashTable中key和value都不允許為null,而HashMap可以且只允許一個key值為null,而value允許一個或者多個為null
5.數據初始化與擴容機制不同
HashTable默認容量為11,而HashMap默認容量為16,HashTable擴容時會將容量變為原來的2被加1,而HashMap會將容量變為2倍。HashTable之所以擴容時會將容量變為2倍加1是因為:HashTable采用取模方式計算數組下標,同時盡量為素數或者奇數,目標是減少Hash碰撞讓計算出來的下標更加分散,讓元素均勻分布于數組中的多個位置
二、為啥HashMap要用數組?鏈表?紅黑樹
1.數組:使用數組可以利用key的hash值能夠快速查詢元素
2.鏈表:由于兩個對象調用哈希函數計算哈希碼值一致導致計算數組的索引值相同,這就是hash沖突。通過將索引值相同的元素放在一個鏈表中去解決hash沖突
3.紅黑樹:如果超過8個節點的鏈表就使用紅黑樹來代替鏈表,從而實現查詢性能的提升