ArrayList
1、初始默認大小爲10
2、擴容條件:當add時 判斷(size+1)- elementData.length 如果大於0,需要進行擴容
3、int newCapacity = oldCapacity + (oldCapacity >> 1) 新增大小爲原來的1.5倍
HashMap
一些基於jdk1.7
1、 重要參數
容量(默認值16),負載因子(0.75)
2、擴容條件:當put時,如果 (size >= threshold) && (null != table[bucketIndex])即size大於 (容量*負載因子) 並且該位置table中不爲null時將進行擴容,擴容後數組大小*2即table*2
3、初始化時大小參數應爲2的N次冪 new HashMap<>(32),如果不是程序會自動調整;
4、put 方法
首先會將傳入的 Key 做 hash 運算計算出 hashcode,然後根據數組長度取模計算出在數組中的 index 下標。
由於在計算中位運算比取模運算效率高的多,所以 HashMap 規定數組的長度爲 2^n 。這樣用 2^n - 1 做位運算與取模效果一致,並且效率還要高出許多。
由於數組的長度有限,所以難免會出現不同的 Key 通過運算得到的 index 相同,這種情況可以利用鏈表來解決,HashMap 會在 table[index]處形成鏈表,採用頭插法將數據插入到鏈表中。
5、在JDK1.8中對HashMap進行了優化:當hash碰撞之後寫入鏈表的長度超過了閾值(默認爲8)並且table的長度不小於64(否則擴容一次)時,鏈表將會轉換爲紅黑樹
6、1.8 擴容條件:++size > threshold