hashmap
⭐對key的hash運算
static final int hash(object key)
通過對key的異或運算 ^ ,將高位與低位進行互換,從而減低了hash衝突,進而降低了系統損耗。
⭐public v put(k key, v value)
1.首先判斷hashmap是否經過初始化,如果沒有經過初始化,預設槽點的數量為16,閥值為負載因子0.75*預設槽點的數量為12.這是判斷是否需要擴容的依據。
2.根據(n - 1) & hash演算法(ps:其實就是 hash mod size結果為槽點位置),找到槽點的位置,然後判斷槽點上是否有值:
2.1如果沒有,則直接將node節點放到槽點上即可。
2.2如果有,則判斷if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
解釋:(舊的node的節點.hash與插入node的節點.hash是否相等 && ((舊的node的節點.key與插入node的節點.key的位址是否相等) || (插入node的節點.key不為null && 插入node的節點.key與舊的node的節點.key的值是否相等))
)2.2.1如果找到則退出迴圈,將舊node節點的值進行替換;
2.2.2如果找不到,則尾插法,插入到鍊錶的尾部,並且判斷鍊錶長度是否》=8,如果大於,則將鍊錶轉變成紅黑樹,便於查詢使用(ps:以鍊錶舉例,jdk1.8尾插法,jdk1.7頭插法)
⭐public v remove(object key)
if ((tab = table) != null && (n = tab.length) > 0 &&
(p = tab[index = (n - 1) & hash]) != null)
1.先判斷該hashmap槽點鏈是否為null,是否有元素,並找到要刪除的槽點判斷該槽點上是否有元素
1.1有,則繼續執行;
1.1.1判斷槽點上的元素是否正是要刪除的元素;
1.1.1.1如果是,則 tab[index] = node.next;
1.1.1.2如果不是,則進行從頭到尾進行遍歷,(ps:以煉表為例)
do p = e;
} while ((e = e.next) != null);
找到後,則 p.next = node.next;
1.2沒有,則return null;
⭐public v get(object key)
if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null)
1.?先判斷該hashmap的槽點鏈不為null,並且有元素,並且通過hash計算key找到該槽點,槽點上是有值的
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
1.1❀判斷要找的key是否為該槽點的首元素,如果是則返回該node節點
if ((e = first.next) != null) while ((e = e.next) != null);
}1.2❀如果不是則對該槽點上的鍊錶進行從頭到尾遍歷(ps:以鍊錶舉例,鍊錶數量大於8,則該槽點上的資料結構為紅黑樹)
增刪改查 dao層原始碼
dbhelper 資料庫連線類 public static connection getconnection throws exception userdao介面類inte ce public boolean register userbean userbean 註冊 public listquer...
HashMap原始碼複習之putVal 方法
putval 方法 hash key的hash值 key 原始key value 要存放的值 onlylfabsent 如果true代表不更改現有的值 evict 如果為false表示table為建立狀態 final v putval int hash,k key,v value,boolean o...
HashMap原始碼系列 HashMap的屬性
public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...