本篇主要解析hashmap的增刪查改以及擴容方法
增加:putval(int hash, k key, v value, boolean onlyifabsent,
boolean evict)
/**
* put方法
* @param hash 處理後的hashcode
* @param key 鍵
* @param value 值
* @param onlyifabsent true表示鍵不存在才放入
* @param evict 擴充套件引數,暫時無用
* @return
*/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;}}
//只有key已經存在才執行下面,覆蓋原來的值
if (e != null)
}++modcount;
//key已經存在的情況,只會覆蓋value,不會導致長度發生變化,所以不會執行下面resize方法
if (++size > threshold)
resize();
//hashmap提供的擴充套件點
afternodeinsertion(evict);
return null;
}
查詢:getnode(int hash, object key)
/**
* 查詢方法相對清晰明了
* @param hash
* @param key
* @return
*/final hashmap.nodegetnode(int hash, object key) while ((e = e.next) != null);}}
//如果上面都沒找到,返回null
return null;
}
刪除:removenode(int hash, object key, object value,
boolean matchvalue, boolean movable)
/**
* 刪除
* @param hash
* @param key
* @param value
* @param matchvalue
* @param movable
* @return
*/final hashmap.noderemovenode(int hash, object key, object value,
boolean matchvalue, boolean movable)
p = e;
} while ((e = e.next) != null);}}
//上面這一部分和get查詢一樣,不再多說了
if (node != null && (!matchvalue || (v = node.value) == value ||
(value != null && value.equals(v))))
}return null;
}
擴容:resize()
/**
* 1.陣列初始化
* 2.陣列擴容
* @return
*/final hashmap.node resize()
else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
}//建立hashmap並設定了初始大小 eg:new hashmap(10)
else if (oldthr > 0)
newcap = oldthr;
//建立hashmap但是沒有設定初始大小 eg:new hashmap()
else
//只有建立hashmap並設定了初始大小,才會走下面
if (newthr == 0)
threshold = newthr;
hashmap.node newtab = (hashmap.node)new hashmap.node[newcap];
table = newtab;
//當第一次初始化map時,不會走下面擴容。直接返回
if (oldtab != null)
//不為0放在高位鏈=原陣列索引位置+原陣列長度
else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}
return newtab;
}
Vector原始碼解析 jdk1 8
概述 vector實現了list的介面,底層同樣是基於陣列實現的,可以儲存null。功能結構與arraylist的類似,不同的是執行緒安全的。建構函式protected object elementdata protected int capacityincrement public vector ...
HashSet原始碼解析 JDK1 8
在我們學過hashmap之後,再來看hashset就很easy了。因為hashset是基於hashmap是實現的。開啟hashset的原始碼,可以看到維護了乙個hashmap 一 成員變數 用來儲存 hashset 的元素private transient hashmap,object map 這個...
jdk1 8原始碼解析 ArrayList
arraylist是乙個長度可調節的陣列,使用者只需向其中新增,刪除,獲取元素,可以向其中新增任何物件 包括null值 無需關係它的擴容,縮減問題。它實現了list介面所有方法,它基本等價於vector,唯一不同的是它沒有任何同步手段,多執行緒環境須慎重考慮。這裡唯一需要注意的是,它實現了乙個ran...