HashMap原始碼分析 基於jdk1 8

2021-08-21 11:40:44 字數 4105 閱讀 2086

初始化

描述 hashmap構造方法一公共有4個,分別如下
/**

* 無參構造

*/public

hashmap()

/*** 給定初始容量

*@param initialcapacity

*/public

hashmap(int initialcapacity)

/** * 指定初始容量和載入因子

*@param initialcapacity

*@param loadfactor

*/public

hashmap(int initialcapacity, float loadfactor)

/** * 基於已有的集合構建

*@param m

*/public

hashmap(map<? extends k, ? extends v> m)

2.新增元素

描述 相對於查詢來說要複雜很多

/**

* 獲取key的hash值

*@param key

*@return

*/static

final

int hash(object key)

/** * 在map中加入元素

*@param key

*@param value

*@return

*/public v put(k key, v value)

/** *

*@param hash 元素的hash值

*@param key 新增的資料的key

*@param value 新增的資料的值

*@param onlyifabsent 是否覆蓋已存在的value

*@param evict

*@return

*/final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

/*key已存在則退出,對value做是否覆蓋處理*/

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

/*e不為空說明key已經存在*/

v oldvalue = e.value;

/*如果onlyifabsent為false 則可以將新值覆蓋舊值*/

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

/*元素個數超過閾值 則需要擴容*/

if (++size > threshold)

resize();

afternodeinsertion(evict);

return

null;

}//重新計算陣列大小

final node resize()

//設定新的容量為原容量的兩倍 如果擴容兩倍小於最大值,且 舊的值大於出事預設值 則設定新的threshold為舊值得兩倍

else

if ((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

table = newtab;

if (oldtab != null)

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}

return newtab;

}/*構造乙個鍊錶節點的建構函式*/

node(int hash, k key, v value, nodenext)

3.查詢元素

描述

4.移除元素

描述

/**

* 查詢元素

*@param key

*@return

*/public v get(object key)

/** * implements map.get and related methods

* *@param hash hash for key

*@param key the key

*@return the node, or null if none

*/final nodegetnode(int hash, object key) while ((e = e.next) != null);}}

return

null;

}

4.移除元素

描述 相對於查詢來說要複雜很多,但是不需要考慮擴容

/**

* * @return the previous value associated with

key, or

* null

key.

* (a null

return can also indicate that the map

* previously associated null

with

key.)

*/public v remove(object key)

/** * implements map.remove and related methods

* * @param hash hash for key

* @param key the key

* @param value the value to match if matchvalue, else ignored

* @param matchvalue if

true only remove if value is equal

* @param movable if

false

donot move other nodes while removing

* @return the node, or

null

if none

*/final noderemovenode(int hash, object key, object value,

boolean matchvalue, boolean movable)

p = e;

} while ((e = e.next) != null);}}

if (node != null && (!matchvalue || (v = node.value) == value ||

(value != null && value.equals(v))))

}return

null;

}

原始碼分析 HashMap原始碼再讀 基於Java8

最近工作不是太忙,準備再讀讀一些原始碼,想來想去,還是先從jdk的原始碼讀起吧,畢竟很久不去讀了,很多東西都生疏了。當然,還是先從炙手可熱的hashmap,每次讀都會有一些收穫。當然,jdk8對hashmap有一次優化 我們首先看到的,應該是它的一些基本引數,這對於我們了解hashmap有一定的作用...

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...