認識HashMap和Hashtable

date: 2017-03-26 19:55:33

先上兩張圖攻锰,比較清晰地解釋了java中常用集合之間的關(guān)系失驶。

HashMap與Hashtable的區(qū)別

1.HashMap不是同步的膳沽,線程不安全窒盐。hashtable則是同步的亏镰,線程安全腊满,但不建議在新代碼中使用套么,在不需要線程安全的情況下培己,可以用HashMap代替,在需要線程安全的情況胚泌,可以使用ConcurrentHashMap替代省咨。
2.HashMap允許鍵值為空,HashTable不允許诸迟。
3.方法上茸炒,HashMap去掉了Hashtable的contains方法。
4.Hashtable是基于陳舊的Dictionary的Map接口的實現(xiàn)阵苇,而HashMap是基于哈希表的Map接口的實現(xiàn)
5.HashMap的iterator迭代器執(zhí)行快速失敗機制壁公,也就是說在迭代過程中修改集合結(jié)構(gòu),除非調(diào)用迭代器自身的remove方法绅项,否則以其他任何方式的修改都將拋出并發(fā)修改異常紊册。而Hashtable返回的Enumeration不是快速失敗的。

認識HashMap

HashMap的存儲結(jié)構(gòu)

HashMap是用數(shù)組+鏈表+紅黑樹(jdk1.8)來實現(xiàn)的快耿。

HashMap的存儲結(jié)構(gòu).png

哈希表為解決沖突囊陡,可以采用開放地址法和鏈地址法等來解決問題,Java中HashMap采用了鏈地址法掀亥。hash表的每個元素又分別鏈接著一個單鏈表撞反,元素為頭結(jié)點,如果不同的key映射到了相同的下標搪花,那么就使用頭插法遏片,插入到該元素對應的鏈表。

HashMap的負載因子

首先撮竿,HashMap的初始化長度length(默認值是16)吮便,Load factor為負載因子(默認值是0.75)。
負載因子=哈希表中的元素/哈希表的長度

默認的負載因子0.75是對空間和時間效率的一個平衡選擇

哈希表長度固定的情況下
當負載因子增大幢踏,空間的利用率增大髓需,Hash沖突的概率增加,在進行g(shù)et房蝉,put操作時,消耗更多時間,節(jié)約內(nèi)存;
當負載因子減小僚匆,空間的利用率減小,Hash沖突的概率降低搭幻,讀取性能更好,但會占用更多內(nèi)存;

能否讓HashMap實現(xiàn)線程安全白热,如何做?

1粗卜、直接使用Hashtable屋确,但是當一個線程訪問HashTable的同步方法時,其他線程如果也要訪問同步方法,會被阻塞住攻臀。舉個例子焕数,當一個線程使用put方法時,另一個線程不但不可以使用put方法刨啸,連get方法都不可以堡赔,效率很低,現(xiàn)在基本不會選擇它了设联。
2善已、HashMap可以通過下面的語句進行同步:

Collections.synchronizeMap(hashMap);
3、直接使用JDK 5 之后的 ConcurrentHashMap离例,如果使用Java 5或以上的話换团,請使用ConcurrentHashMap。

JDK1.8中的HashMap

當HashMap因Hash沖突導致鏈表過長時,HashMap會動態(tài)的將它替換成一個紅黑樹宫蛆,這話的話會將時間復雜度從O(n)降為O(logn),很大程度上提高了HashMap的性能艘包。

認識HashTable

Hashtable繼承于Dictionary類,實現(xiàn)了Map接口耀盗。Dictionary是聲明了操作"鍵值對"函數(shù)接口的抽象類想虎。 有一點注意,HashTable除了線程安全之外(其實是直接在方法上增加了synchronized關(guān)鍵字叛拷,比較古老舌厨,落后,低效的同步方式)忿薇,還有就是它的key裙椭、value都不為null。另外Hashtable 也有 初始容量 和 加載因子煌恢。

默認加載因子也是 0.75骇陈,HashTable在不指定容量的情況下的默認容量為11震庭。

參考文章:

美團:Java 8系列之重新認識HashMap
極樂科技Java集合專題總結(jié)(1):HashMap 和 HashTable 源碼學習和面試總結(jié)
官方hashtable API
官方HashMap api

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑰抵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子器联,更是在濱河造成了極大的恐慌二汛,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拨拓,死亡現(xiàn)場離奇詭異肴颊,居然都是意外死亡,警方通過查閱死者的電腦和手機渣磷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門婿着,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事竟宋√嵬辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵丘侠,是天一觀的道長徒欣。 經(jīng)常有香客問我,道長蜗字,這世上最難降的妖魔是什么打肝? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挪捕,結(jié)果婚禮上粗梭,老公的妹妹穿的比我還像新娘。我一直安慰自己担神,他們只是感情好楼吃,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妄讯,像睡著了一般孩锡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亥贸,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天躬窜,我揣著相機與錄音,去河邊找鬼炕置。 笑死荣挨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朴摊。 我是一名探鬼主播默垄,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甚纲!你這毒婦竟也來了口锭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤介杆,失蹤者是張志新(化名)和其女友劉穎鹃操,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春哨,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡荆隘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赴背。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椰拒。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡晶渠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燃观,到底是詐尸還是另有隱情乱陡,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布仪壮,位于F島的核電站憨颠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏积锅。R本人自食惡果不足惜爽彤,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缚陷。 院中可真熱鬧适篙,春花似錦、人聲如沸箫爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虎锚。三九已至硫痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窜护,已是汗流浹背效斑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柱徙,地道東北人缓屠。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像护侮,于是被迫代替她去往敵國和親敌完。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容