原文网址:Java之List系列--ArrayList扩容的原理_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍Java的ArrayList是如何进行扩容的。即:扩容的机制。
重要大小
类 | 初始大小 | 加载因子 | 扩容倍数 | 底层实现 | 是否线程安全 | 同步方式 |
ArrayList | 10 | 1 | 1.5倍 | Object数组 | 线程不安全 | 无 |
Vector | 10 | 1 | 2倍 | Object数组 | 线程安全 | synchronized |
下边介绍ArrayList的扩容机制。
扩容机制
1. new一个ArrayList对象
直接new 一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。
public ArrayList() {
// DEFAULTCAPACITY_EMPTY_ELEMENTDATA 变量为一个空的数组
// private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2. 调用add()方法
当第一次调用ArrayList对象的add方法时,分配容量大小
public boolean add(E e) {
// size为ArrayList的实际数量大小而非容量大小,若未指定容量构建ArrayList对象,size为0
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
// 如果为空数组,最小需要容量为默认容量DEFAULT_CAPACITY 也就是10
// private static final int DEFAULT_CAPACITY = 10;
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 调用扩容方法
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
//protected transient int modCount = 0;
modCount++;
// 如果需要的最小容量大于此时的容量,调用真正的扩容方法
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
3. 扩容
上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-ArrayList扩容的原理 - 自学精灵