在Java中,ArrayList和LinkedList等集合类使用了动态扩容策略来存储和管理元素。这里以ArrayList为例,介绍其内部实现原理以及如何实现动态扩容。
ArrayList内部实现原理: ArrayList是一个动态数组,其底层使用一个Object类型的数组elementData来存储元素。当向ArrayList中添加元素时,如果elementData的长度小于等于需要添加的元素个数,那么ArrayList会进行动态扩容。
动态扩容的实现: ArrayList的动态扩容主要包括以下几个步骤:
a. 计算新的容量:首先,计算新的容量大小。通常情况下,新的容量大小为原容量的1.5倍。这是因为扩容操作需要消耗一定的资源,为了减少扩容操作的次数,通常会预留一定的空间。
b. 检查新容量是否合法:如果新的容量大小为Integer.MAX_VALUE,那么将新的容量设置为Integer.MAX_VALUE。这是因为在Java中,数组的最大长度为Integer.MAX_VALUE,所以需要检查新容量是否超过了这个值。
c. 创建新的数组:根据新的容量大小,创建一个新的数组。新的数组的长度为新容量大小。
d. 复制元素:将原数组中的元素复制到新数组中。注意,这里是从原数组的最后一个元素开始复制,直到新数组的第一个元素。
e. 更新数组引用:将原数组的引用更新为新数组。
示例代码:
import java.util.ArrayList;
public class DynamicArrayDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("Element " + i);
if (list.size() == list.capacity()) {
System.out.println("Dynamic resizing occurred.");
list = new ArrayList<>(list.capacity() * 2);
}
}
System.out.println(list);
}
}
在这个示例中,我们创建了一个ArrayList,并向其中添加了10个元素。当ArrayList的容量不足以存储新添加的元素时,会自动进行动态扩容。