初始化
描述 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...