HashMap的实现原理及其特点
HashMap的實現原理及其特點
2018年03月15日 20:43:08?閱讀數:11045更多
個人分類:?Java基礎知識點
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lovewebeye/article/details/79573702
1)?HashMap可以接受null鍵值和值,而HashTable則不能,HashMap是非synchronized的;存儲的是鍵值對。
2)?HashMap是基于hashing原理,使用put(key,value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象,當我們給put方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,返回的hashCode用于找到bucket位置來存儲鍵對象和值對象,作為Map.Entry.
3)?如果兩個對象hashCode相同:
存儲時:他們會找到相同的bucket位置,發生碰撞,因為HashMap使用鏈表存儲對象(每個Map.Entry都有一個next指針),這個Entry會存儲在鏈表中。
獲取時:會用hashCode找到bucket位置,然后調用key.equals()方法找到鏈表中正確的節點.最終找到要找的值對象.
減少碰撞:使用final修飾的對象、或不可變的對象作為鍵,使用(Integer、String)(是不可變、final的,而且已經重寫了equals和hashCode方法)這樣的wrapper類作為鍵是非常好的,(我們可以使用自定義的對象作為鍵嗎?答:當然可以,只要它遵守了equals和hashCode方法定義規則,并且當對象插入到Map中之后將不會再改變。)
4)?HashMap負載因子默認是0.75,可設置,當map填滿了75%的bucket時候,將會創建原來HashMap大小兩倍的bucket數組,來重新調整map的大小,并將原來的對象放入新的bucket數組中,這個過程叫做rehashing,因為它調用hash方法找到新的bucket位置。
5)?重新調整map大小可能會發生競爭問題:如果兩個線程都發現HashMap需要調整大小了,它們都會嘗試進行調整,在調整中,存儲在鏈表中的元素的次序會反過來,因為移動bucket位置的時候,HashMap并不會將元素放在鏈表的尾部,而是放在頭部,這是為了避免尾部遍歷,如果條件競爭發生了,就死循環了。
總結
以上是生活随笔為你收集整理的HashMap的实现原理及其特点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leme蓝牙耳机怎么连接电脑(无线蓝牙耳
- 下一篇: 暗黑血统手柄设置(支持手柄的暗黑类游戏)