1. 程式人生 > >HashMap底層原理以及與ConCurrentHashMap區別

HashMap底層原理以及與ConCurrentHashMap區別

clas put level shm segment 區別 一個 bucket link

  HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,對象將會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對對象。

  當兩個不同的鍵對象的hashcode相同時會發生什麽? 它們會儲存在同一個bucket位置的LinkedList中。鍵對象的equals()方法用來找到鍵值對。

在hashMap的基礎上,ConcurrentHashMap將數據分為多個segment,默認16個(concurrency level),然後每次操作對一個segment加鎖,避免多線程鎖得幾率,提高並發效率。

默認一個ConcurrentHashMap中有16個子HashMap,所以相當於一個二級哈希。對於所有的操作都是先定位到子HashMap,再作相應的操作。

HashMap的鍵值對允許有null,但是ConCurrentHashMap都不允許。

HashMap底層原理以及與ConCurrentHashMap區別