1. 程式人生 > >java 關於HashMap的工作原理和優化

java 關於HashMap的工作原理和優化

 相信大家都用過HashMap,但是可能一些新手不知它的工作原理從而導致HashMap的效能非常糟糕!

為什麼這麼說呢?效能非常好的HashMap是什麼情況下會導致效能下降那麼多呢?

首先來說說HashMap的工作原理吧:

工作原理:

HashMap 是基於hashing(雜湊演算法)原理,呼叫者通過put()和get()方法獲取物件。當呼叫者通過put()將鍵值對傳過去,它呼叫鍵值對的hashCode方法來計算hashcode值,然後根據hashCode值找到bucket(桶)的位置來儲存物件;當呼叫者通過get()方法獲取物件時,通過鍵物件的equals()方法來找到對應的鍵值對,然後返回值物件;

HashMap 使用連結串列來解決解決hash“碰撞”問題,當發生“碰撞”時,將物件儲存在連結串列的下一個節點。HashMap 在每個連結串列節點裡儲存的是鍵值物件。當兩個不同的鍵物件的hashcode值相同,它們會儲存在同一個bucket位置的連結串列中,獲取值物件是會通過鍵的equals方法來知道鍵值對:

說到這,那麼問題來了,“當兩個值物件的hashCode值相等時會發什麼?”

首先明確一點hashCode值相等並不能判斷兩個物件相等,如果兩個不同的物件hashCode 值相等,所以在儲存的時候發生了“碰撞”,因為hashCode值相等,所以儲存在相同位置的bucket的連結串列中,最壞的情況所有的對應都儲存在同一個位置的bucket中的連結串列中,這樣HashMap 就退化成了一個連結串列,查詢資料時查詢時間從O(1)到O(n),大大降低了HashMap的效能,在這種情況下你就應該考慮是否繼續使用HashMap?

那麼問題又來了,對於上述問題如何優化?

優化上述的辦法就是減少“碰撞”,如何減少“碰撞”?

1.String, Interger這樣的wrapper類作為HashMap的鍵;而且String最為常用,因為String是不可變的,也是final的,而且已經重寫了equals()和hashCode()方法了。其他的wrapper類也有這個特點。不可變性是必要的,因為為了要計算hashCode(),就要防止鍵值改變

2.使用自定義的物件作為鍵時遵守重寫equals()和hashCode()方法的規則,保證不同的物件不要出現相同的hashCode;

好了,對於提高HashMap的建議就這些吧,希望能幫助需要的朋友們!!!

友情提示:java 8 已經對HashMap的效能提升