hashmap相信大家都用過,是以這樣的格式儲存的。其實內部真正用於儲存的是entry的陣列table(桶)。,下面就是源**了已經標註出來了
emprty_table是個空表,用於是初始化時使用的。default_load_factor是負載因子,default_initial_capacity是初始化容量,maximum_capacity是最大容量是2^30=1073741824.
size才是你儲存的容量大小。
integer.hightestonebit(int)是將給定引數的最高位的1保留,剩下的變為0的操作,簡單說就是將引數int變為小於等於它的最大的2的n次冪。
講一下entry的結構,有個key,value和對應下乙個entry
物件next和hash值,類似鍊錶結構。
接下來講解一下hashmap的最為重要的取值get(key),儲存put(key,value)的內容,在這之前,hashmap並不是直接將key作為桶table的下標,而是經過計算hash(key)=hashcode,在拿hashcode進行函式indexfor()計算出對應index。接下來先講一下get的過程。
1.get在取值的過程中,先進性判斷key是否為null,如果為null,直接定位到index=0的煉表列,然後做迴圈查詢key為null的value,如果key不為空,進行hash(key),indexfor()運算得到下標i,計算出對應的index=i的煉表列,然後迴圈查詢此煉表列key等同的value,找不到返回null。貼一下源**
2.put的儲存值的過程是,(空table擴容我就不說了),判斷key是否為null,如果為null,直接定位到index=0的煉表列,直接然後做迴圈查詢key為null的物件entry,如果entry物件存在就進行更新value,如果不存在,就建立entry物件,然後將table[0]的鍊錶作為entry的next;如果key不為空,進行hash(key),indexfor()運算得到下標i,計算出對應的index=i的煉表列,然後迴圈查詢此煉表列key等同的value,如果entry物件存在就進行更新value,如果不存在,就建立entry物件,然後將table[i]的鍊錶作為entry的next。下面是對應的原始碼。
新增entry的方法原始碼:
大概的主要方法講完了。
但是還有個關鍵點就是hashmap不是執行緒安全的,在多執行緒的環境下,可能出現key對應的value的不一致的。
那在多執行緒下使用hashmap我們需要怎麼做,幾種方案:
第一中就不講了,可以增加對應sunchronized進行同步**塊操作,稍微講一下其他三個方法吧。
1. map map= collections.synchronizedmap(new hashmap());
這裡做的操作就是呼叫了collections裡面synchronizedmap()的方法(裡面還有好多其他的list,set等方法),返回了乙個乙個新的物件synchronizedmap,此類為collections的內部類,此內容類會對對應的map物件的關鍵的方法進行同步封裝,使其是同步的。
2.hashable也是採用了進行方法包裝加上synchronized ,hashtable與hashmap繼承不同的類,hashtable繼承dictionary類,而hashmap繼承abstractmap類,hashtable不允許空值key or value ,而hashmap是允許乙個key為null,多個null 的value。
3.concurrentmap是用了更為新穎的思想,沒用用entry物件而是使用了segment物件,而segment繼承了可重入鎖。
concurrenthashmap為了提高本身的併發能力,在內部採用了乙個叫做segment的結構,乙個segment其實就是乙個類hash table的key ,value結構,segment內部維護了乙個鍊錶陣列.
hashmap是非執行緒安全的,hashtable是執行緒安全的,但是由於hashtable是採用synchronized進行同步,相當於所有執行緒進行讀寫時都去競爭一把鎖,導致效率非常低下。concurrenthashmap可以做到讀取資料不加鎖,並且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持地盡量地小,不用對整個concurrenthashmap加鎖。concurrentmap的內容到時候具體再詳解了。
關hashMap跟hashTable的區別
1.hashmap和hashtable都實現了map介面 2.hashmap是非synchronized,而hashtable是synchronized 3.hashtable使用enumeration,hashmap使用iterator 4.hashtable直接使用物件的hashcode,has...
HashMap解析以及使用
一 hashmap的資料結構 hashmap的資料結構是鍊錶雜湊,即陣列和鍊錶的結合體。陣列 儲存空間連續,空間複雜度高,便於查詢,不便於插入和刪除 鍊錶 儲存空間離散,空間複雜度小,便於插入和刪除,反而定址困難不易查詢 二 底層原始碼實現 儲存的原始碼 public v put k key,v v...
手寫HashMap,實現put,get以及擴容
public class myhashmap public int gethash public void sethash int hash public k getkey public void setkey k key public v getvalue public void setvalue...