java中ArrayList扩容原理
时间: 2023-11-21 12:52:09 浏览: 106
Java中的ArrayList是一种动态数组,它可以根据需要自动增长和缩小。当我们向ArrayList中添加元素时,如果当前容量不足以容纳新元素,就需要对ArrayList进行扩容。ArrayList的扩容原理如下:
1. 当我们创建一个ArrayList对象时,它会默认创建一个长度为10的数组作为底层存储结构。
2. 当我们向ArrayList中添加元素时,如果当前元素个数已经等于底层数组的长度,就需要对ArrayList进行扩容。
3. 扩容时,ArrayList会创建一个新的数组,并将原数组中的元素复制到新数组中。
4. 新数组的长度通常是原数组长度的1.5倍,这是为了避免频繁扩容带来的性能损耗。
5. 扩容完成后,ArrayList会将新数组作为底层存储结构,原数组会被垃圾回收。
相关问题
arraylist扩容原理面试题
ArrayList是Java中的动态数组,它的扩容原理如下:
1. 初始容量:当我们创建一个ArrayList对象时,它会分配一定的初始容量,比如10个元素。这个初始容量可以通过构造函数中的参数进行指定,如果没有指定,默认为10。
2. 容量不足:当我们往ArrayList中添加元素时,如果当前容量不足以容纳新的元素,就需要进行扩容。扩容意味着需要创建一个更大的数组,并将原有的元素复制到新数组中。
3. 扩容策略:ArrayList的扩容策略是自动增长当前容量的一半。具体来说,当需要扩容时,它会创建一个新的数组,新数组的大小为当前容量加上当前容量的一半。例如,如果当前容量为10,则新数组的大小为15。
4. 复制元素:在进行扩容时,ArrayList会使用System.arraycopy()方法将原有的元素复制到新数组中。这个过程需要遍历原有数组,并将元素逐个复制到新数组的对应位置。
5. 更新引用:一旦完成元素复制,ArrayList会将内部的引用指向新数组,以便后续的操作可以基于新数组进行。
总结起来,ArrayList的扩容原理可以概括为:当需要添加元素时,如果当前容量不足,则创建一个更大的数组,并将原有元素复制到新数组中,然后更新内部引用指向新数组。这样就实现了ArrayList的动态扩容。
ArrayList扩容原理源码讲解
ArrayList的扩容原理源码如下:
```java
private void grow(int minCapacity) {
// 获取当前ArrayList容量
int oldCapacity = elementData.length;
// 容量增加1.5倍,右移1位相当于除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果新容量小于最小容量,则将最小容量作为新容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量超出最大容量,则调用hugeCapacity方法获取最大容量
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 将原数组复制到新数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
当ArrayList的元素数量超过其容量时,就需要进行扩容操作。ArrayList的扩容操作是通过grow()方法实现的。该方法首先获取当前ArrayList的容量oldCapacity,然后将其增加1.5倍(右移1位相当于除以2),得到新的容量newCapacity。如果新容量小于最小容量,则将最小容量作为新容量;如果新容量超出了ArrayList所能承受的最大容量MAX_ARRAY_SIZE,则调用hugeCapacity方法获取最大容量。
最后,将原数组复制到新数组中,这样就完成了ArrayList的扩容操作。需要注意的是,每次扩容都会创建一个新的数组,并将原数组中的元素复制到新数组中,这样会导致一定的开销。因此,在使用ArrayList时,应该尽量避免频繁进行扩容操作,以提高性能。
阅读全文