ArrayList扩容机制
ArrayList每次扩容是原来的1.5倍。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这样代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。尽可能指定其容量,以避免数组扩容的发生。
初始化方式不同,容量也不同:
初始化方式 | 容量 | 数量变化 |
---|---|---|
List arrayList = new ArrayList(); | 初始数组容量为10,当真正对数组进行添加时,才真正分配容量 | 10->15->22->33->49->74->… |
List arrayList = new ArrayList(4); | 4 | 4->6->9->13->19->… |
可通过断点查看扩容情况:
public class TestArrayList {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
if (i == 1) {
System.out.println("断点位置 没添加元素时候容量 0");
}
list.add(i);
if (i == 1) {
System.out.println("断点位置 第一次添加元素 容量 10");
}
if (i == 11) {
System.out.println("断点位置 第1次扩容 容量 15");
}
if (i == 16) {
System.out.println("断点位置 第2次扩容 容量15*1.5= 22.5,22 or 23 ");
}
}
}
}
断点看扩容情况2
public class TestArrayList1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(4);
for (int i = 1; i <= 20; i++) {
if (i == 1) {
System.out.println("断点位置 没添加元素时候容量 4");
}
list.add(i);
if (i == 5) {
System.out.println("断点位置 第一次扩容 容量 6 ");
}
if (i == 7) {
System.out.println("断点位置 第二次扩容 容量9");
}
}
}
}