配合源码分析ArrayList集合通过空参构造方法创建对象,并第一次添加元素的过程
时间: 2023-06-15 11:08:15 浏览: 73
Java集合框架ArrayList源码分析(一)
好的,下面是源码分析ArrayList集合通过空参构造方法创建对象,并第一次添加元素的过程:
1. 首先,通过空参构造方法创建ArrayList对象,代码如下:
```
ArrayList<Object> arrayList = new ArrayList<>();
```
2. 在ArrayList类中,空参构造方法的实现如下:
```
public ArrayList() {
// 默认初始容量为10
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
```
其中,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组,定义如下:
```
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
```
3. 接着,当第一次向ArrayList添加元素时,会调用ensureCapacityInternal()方法来确保容量足够存放新的元素。在这个过程中,如果当前容量不足,会自动进行扩容操作。代码如下:
```
arrayList.add("hello");
```
4. 在add()方法中,会先调用ensureCapacityInternal()方法进行容量检查和扩容操作,代码如下:
```
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 当前容量小于所需最小容量时,进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// 计算新容量,为原容量的1.5倍
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量超过了最大容量,则将新容量设置为Integer.MAX_VALUE
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 进行数组复制,扩容
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
5. 在ensureCapacityInternal()方法中,会先判断当前容量是否为默认初始容量,如果是,则将所需最小容量和默认容量进行比较,取较大值作为新容量。如果当前容量已经大于默认初始容量,则直接调用ensureExplicitCapacity()方法进行容量检查和扩容操作。
6. 在ensureExplicitCapacity()方法中,会先对modCount进行自增操作,然后判断当前容量是否小于所需最小容量,如果小于,则调用grow()方法进行扩容操作。
7. 在grow()方法中,会先计算出新容量,然后判断新容量是否超过了最大容量,如果超过,则将新容量设置为Integer.MAX_VALUE。最后,调用Arrays.copyOf()方法进行数组复制,完成扩容操作。
综上所述,ArrayList集合通过空参构造方法创建对象,并第一次添加元素的过程,主要就是进行容量检查和扩容操作。如果当前容量不足,就需要进行扩容操作,扩容后再添加元素。这个过程中,ArrayList会自动进行容量的调整,保证存储的元素数量不会超过当前容量。
阅读全文