You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:16:12