HashMap原始碼分析 一

2021-10-09 07:28:24 字數 2010 閱讀 4037

還是從我們使用者的角度一步一步來分析吧。首先我們一般 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...