Java arraylist 扩容机制
时间: 2023-06-06 17:04:38 浏览: 140
Java ArrayList 扩容机制是在添加元素时,如果当前元素个数已经等于数组容量,就会触发扩容操作。扩容机制的默认实现是将容量扩大至原来的 1.5 倍,并将原数组中的元素复制到新的数组中。如果指定了初始容量,扩容时会将容量扩大至原来的 1.5 倍或指定容量中的最大值。
相关问题
java arraylist扩容机制
Java ArrayList 扩容机制是当 ArrayList 中的元素数量超过了当前容量时,会自动进行扩容。扩容的方式是创建一个新的数组,将原数组中的元素复制到新数组中,然后将新数组赋值给 ArrayList 的内部数组。默认情况下,扩容的大小是当前容量的一半。
java ArrayList扩容机制源码
ArrayList扩容机制的源码如下:
```java
private void ensureCapacityInternal(int minCapacity) {
// 如果当前容量不足,则需要进行扩容操作
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 如果当前容量是默认值,则需要将其扩容为默认容量或者minCapacity
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) {
// 当前容量
int oldCapacity = elementData.length;
// 扩容后的容量
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果扩容后的容量仍然小于需要的最小容量,则直接使用需要的最小容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果扩容后的容量超过了ArrayList最大容量,则进行特殊处理
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 创建新的数组,并将原数组中的元素复制到新数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
```
在上述代码中,`ensureCapacityInternal`方法首先判断当前容量是否足够,如果不足,则调用`ensureExplicitCapacity`方法进行扩容操作。`ensureExplicitCapacity`方法会比较需要的最小容量和当前容量的差值,如果超过了当前容量,则进行扩容操作。`grow`方法是扩容的核心方法,它会首先计算扩容后的容量,然后根据扩容后的容量创建新的数组,并将原数组中的元素复制到新数组中。如果扩容后的容量超过了ArrayList最大容量,则进行特殊处理。`hugeCapacity`方法用于计算需要的最大容量,如果超过了最大容量,则抛出OutOfMemoryError异常。
阅读全文