Java中如何实现数组扩容?自定义动态Array类扩容故障排查
问题分析与修复方案
你的动态数组类存在两个核心问题,导致扩容逻辑看似未生效:
1. 扩容后未同步更新容量变量
resize方法里创建了扩容后的新数组,但没有更新size变量的值。原size存储的是数组初始容量,扩容后这个变量未同步变大,导致后续print方法只能遍历到原容量长度,看不到扩容后添加的元素。
2. print方法遍历逻辑错误
print方法用size作为循环上限,但size是数组的容量,实际存储的元素个数是pointer。即便扩容成功,也只会打印旧容量内的元素,新添加的元素无法输出。
另外,pointer被设为public,外部代码可直接修改它,容易破坏数组内部状态,建议改为private并提供获取元素个数的方法。
修正后的代码
public class Array { private int[] array; // 改名capacity更准确,代表数组的容量 private int capacity; private int pointer; private static int DEFAULT_CAPACITY = 5; Array() { this(DEFAULT_CAPACITY); } Array(int capacity) { this.capacity = capacity; this.array = new int[capacity]; this.pointer = 0; } public void add(int element) { if (isFull()) { resize(); } array[pointer] = element; pointer++; } private boolean isFull() { return pointer == array.length; } private void resize() { // 扩容为当前容量的2倍,同步更新capacity this.capacity *= 2; int[] temp = new int[capacity]; for (int i = 0; i < array.length; i++) { temp[i] = array[i]; } array = temp; } public void print() { // 遍历实际存储的元素个数pointer for (int i = 0; i < pointer; i++) { System.out.println(array[i]); } } // 提供获取实际元素个数的方法 public int size() { return pointer; } // 提供获取数组容量的方法 public int capacity() { return capacity; } }
关键修复点说明
- 将原
size变量改名为capacity,语义更清晰,避免和实际元素个数混淆 resize方法中同步更新capacity的值,匹配扩容后的数组容量print方法循环上限改为pointer,确保打印所有已添加的元素- 将
pointer改为private,并添加size()和capacity()方法供外部获取状态,避免内部状态被非法修改
内容的提问来源于stack exchange,提问作者Nikhil Yadav
相关产品推荐
相关产品推荐

