還是從我們使用者的角度一步一步來分析吧。首先我們一般 map map=new hashmap();
構造方法原始碼如下。
其實只是初始化了乙個裝載因子,這個變數幹啥用的呢?
loadfactor譯為裝載因子。裝載因子用來衡量hashmap滿的程度。loadfactor的預設值為0.75f。計算hashmap的實時裝載因子的方法為:size/capacity,而不是占用桶的數量去除以capacity。
public
hashmap()
那麼我們分析下 map.put(key,value)方法,這個方法代表放入乙個鍵值對。因為hashmap本身就是儲存鍵值對的,key唯一,並且key可以為null。來看下這個方法的原始碼
public v put
(k key, v value)
這個hash方法非常關鍵是關乎效能的。首先理解乙個概念
threshold表示當hashmap的size大於threshold時會執行resize操作。
threshold=capacity*loadfactor。可見這個裝載因子應該小於1,並且不能太小。
final v putval
(int hash, k key, v value,
boolean onlyifabsent,
boolean evict)
//如果在鍊錶中找到了自己,那麼更新即可。
if(e.hash == hash &&
((k = e.key)
== key ||
(key != null && key.
equals
(k))))
break
; p = e;}}
//正常應該是進入的。返回了value值。
if(e != null)
}//修改次數增加。
++modcount;
//判斷是否需要重新擴容。if(
++size > threshold)
resize()
;afternodeinsertion
(evict)
;return null;
}
介紹的resize方法分析。這個至少包含初始容量擴容和已有容量再擴容。resize針對非鍊錶,鍊錶,樹進行了三種不同型別的擴容,因為容量擴大2倍,原先的位置也需要變動。非鍊錶位置是不變的。
final node
resize()
elseif(
(newcap = oldcap <<1)
< maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr <<1;
// double threshold
}else
if(oldthr >0)
// initial capacity was placed in threshold
newcap = oldthr;
else
if(newthr ==0)
threshold = newthr;
@suppresswarnings()
node
newtab =
(node
)new
node
[newcap]
; table = newtab;
if(oldtab != null)
else
}while
((e = next)
!= null);if
(lotail != null)
if(hitail != null)}}
}}return newtab;
}
先分析到這吧,以後有時間再細化裡面的過程,一時半會難以寫完,特別是紅黑樹那塊的操作就是乙個難點。 HashMap原始碼分析
public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...
HashMap 原始碼分析
1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...
HashMap原始碼分析
public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...