涉及集合的初始容量、加载因子、扩容增量;不同JDK版本的ArrayList扩容增量有差异
目录
加载因子:存储数据的个数与最大存储量的比值,表示元素填满的程度,元素个数达到容量长度时,进行扩容。
List
-
ArrayList:
默认内存(10),加载因子(1),扩容原容量*1.5,线程不安全
*不同jdk是不一样的,(1.5倍+1)出现在jdk1.6,其他1.7和1.8都是(1.5倍扩容)*
例如:ArrayList初始容量为10,一次扩容后容量是 10 * 1.5 = 15
//基于jdk1.6
public void ensureCapacity(int var1) {
++this.modCount;
int var2 = this.elementData.length;
if (var1 > var2) {
Object[] var3 = this.elementData;
int var4 = var2 * 3 / 2 + 1;
if (var4 < var1) {
var4 = var1;
}
this.elementData = Arrays.copyOf(this.elementData, var4);
}
}
// 基于jdk1.7、jdk1.8
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
-
Vector:
默认内存(10),加载因子(10),扩容原容量*2,线程安全
例如:Vector初始容量为10,一次扩容后容量是 10 * 2 = 20
Set
-
HashSet:
默认内存(16)为了更快的查找,加载因子(0.75),扩容原容量*2,线程不安全
例如:HashSet初始容量为16,加载因子0.75f,数据量达到12时,进行扩容, 一次扩容后容量是 16 * 2 = 32
Map
-
HashMap:
默认内存(16)为了更快的查找,加载因子(0.75),扩容原容量*2,线程不安全
例如:HashMap初始容量为16,加载因子0.75f,数据量达到12时,进行扩容, 一次扩容后容量是 16 * 2 = 32
-
HashTable:
默认内存(11),加载因子(0.75),扩容原容量*2+1,线程安全
例如:HashSet初始容量为11,加载因子0.75f,数据量达到9时,进行扩容, 一次扩容后容量是 11 * 2 + 1 = 23