hashtable整體架構
hashtable實現雜湊表,該雜湊表將鍵對映到值。可以是任何不為空的key或者value。主要是因為hashtable的儲存或者檢索key必須實現hashcode 和equals方法,其類圖如下:
類註解資訊
重要的成員變數
初始化方式/**
* 存放雜湊表的資料
*/private
transient entry,
?>
table;
/** * hashtable中實際資料個數.
*/private
transient
int count;
/** *當表的大小超過此閾值時,表將被重新對映。 (
* 此字段的值為(int)(容量* loadfactor)
*/private
int threshold;
/** * hashtable承載因子.
*/private
float loadfactor;
/** * 記錄hashtable版本修改
*/private
transient
int modcount =
0;
public
hashtable()
public
hashtable
(int initialcapacity)
public
hashtable
(int initialcapacity,
float loadfactor)
新增方法(put)hashtable新增資料的大致流程public
hashtable
(map<
?extendsk,
?extends
v> t)
對入參的key 和value做資料校驗,key和value都不能為空.
計算新的資料節點的key對應到陣列的響應的陣列索引。如果該索引的位置已經有值,則進行覆蓋,不存在則呼叫新增addentry()方法新增資料節點。
檢查陣列中的大小大於閾值的進行擴容,走4。否則直接建立新的 entrye並存入陣列table中,
計算出行的陣列容量,新的陣列容量為oldcapacity << 1 相當於 乘以2 在加1.
根據新計算的擴容大小進行擴容。
addentry新增節點public
synchronized v put
(k key, v value)
// 確保key尚未在雜湊表中。
entry,
?> tab[
]= table;
// 計算key的雜湊值。如果為空則丟擲空指標
int hash = key.
hashcode()
;// 計算出新增資料節點落在table的索引位置。
//0x7fffffff為 最大的整型數 int就是除了首位是 0,其餘都是1
// & 運算如果相對應位都是1,則結果為1,否則為0
int index =
(hash &
0x7fffffff
)% tab.length;
@suppresswarnings
("unchecked"
) entry
entry =
(entry
)tab[index]
;// 遍歷hashtable,如果key已經在hashtable中,則將新新增的資料value覆蓋老的value值
// 並將老值返回
for(
; entry != null ; entry = entry.next)
}// 不存在則直接呼叫新增節點方法,並返回null
addentry
(hash, key, value, index)
;return null;
}
擴容rehash方法private
void
addentry
(int hash, k key, v value,
int index)
// 建立新的節點
@suppresswarnings
("unchecked"
) entry
e =(entry
) tab[index]
; tab[index]
=new
entry
<
>
(hash, key, value, e)
;// 桶中數量的修改
count++
;}
批量新增putall()/**
* hashtable擴容
*/@suppresswarnings
("unchecked"
)protected
void
rehash()
// 建立新的陣列。
entry,
?>
newmap =
newentry
,?>
[newcapacity]
;// 記錄版本修改
modcount++
;// 重新計算新的閾值,取出這兩者的最小值
threshold =
(int
)math.
min(newcapacity * loadfactor, max_array_size +1)
;// 將新建立出來的陣列覆蓋原先陣列
table = newmap;
// 將原先的資料重新計算落在新的陣列的位置
for(
int i = oldcapacity ; i--
>0;)}}
get方法public
synchronized
void
putall
(map<
?extendsk,
?extends
v> t)
remove方法public
synchronized v get
(object key)
}// 找不到則返回null
return null;
}
clear方法/**
* 從中刪除鍵(及其相應的值)雜湊表。如果鍵不在雜湊表中,則此方法不執行任何操作
* @param key 需要取下的鍵
*/public
synchronized v remove
(object key)
else
count--
; v oldvalue = e.value;
e.value = null;
return oldvalue;}}
return null;
}
contains方法// 清除雜湊表中的值,
public
synchronized
void
clear()
hashtable與hashmap區別public
synchronized
boolean
contains
(object value)
entry,
?> tab[
]= table;
// 遍歷陣列中的entry的value相等則返回true,沒有則為false
for(
int i = tab.length ; i--
>0;
)}}return
false
;}
JDK原始碼分析 Vector
vector和arraylist有一定的不同 int newcapacity oldcapacity capacityincrement 0 capacityincrement oldcapacity 從這一句我們可以看出 增長容量 capacityincrement 0 增長倍數 陣列數量 舊容量...
JDK原始碼分析 Collections
1.集合框架圖 hashmap是通過 拉鍊法 實現的雜湊表。它包括幾個重要的成員變數 table,size,threshold,loadfactor,modcount。table是乙個entry陣列型別,而entry實際上就是乙個單向鍊錶。雜湊表的 key value鍵值對 都是儲存在entry陣列...
jdk1 8之ArrayList原始碼分析(二)
通過分析原始碼,你會發現,一些你在工作中無法體會到的一些現象,通過原始碼的了解,會擴散你的思維.這一次是講解下arraylist的刪除以及通過角標來新增元素。在檢視刪除方法的時候,remove方法存在兩個過載的方法,乙個是index乙個通過值的形式,進行刪除,public e remove int ...