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

Java中如何动态修改对象数组的大小以支持动态添加元素?

解决Java对象数组动态扩容的问题

嗨,我来帮你搞定这个问题!你遇到的ArrayIndexOutOfBoundsException是因为Java里的数组是固定大小的——你初始化了长度为2的Element[]数组,它的索引范围只能是0和1,直接访问索引2肯定会触发越界错误。

要实现动态添加任意数量的Element对象,有两种常见方案,我优先推荐更简单实用的第一种:

方案一:使用ArrayList(推荐)

Java的集合框架里的ArrayList就是为动态数组设计的,它会自动处理容量扩容的逻辑,你完全不用手动管理数组大小。

修改你的代码只需要把固定数组换成ArrayList,核心方法是add()添加元素,get()获取指定位置的元素:

import java.util.ArrayList;

public class Element {
    int posX, posY;
    int elementNumber;
    
    Element(int posX, int posY, int elementNumber) {
        this.posX = posX;
        this.posY = posY;
        this.elementNumber = elementNumber;
    }
}

public class Main {
    public static void main(String[] args) {
        // 初始化一个空的ArrayList,用来存储Element对象
        ArrayList<Element> elementsList = new ArrayList<>();
        
        // 创建ELEMENT 0和ELEMENT 1
        for (int i = 0; i < 2; i++) {
            System.out.println("Setting " + i + " element");
            elementsList.add(new Element(i + 20, i + 40, i));
            Element current = elementsList.get(i);
            System.out.println("posX for " + current.elementNumber + " is: " + current.posX);
            System.out.println("posY for " + current.elementNumber + " is: " + current.posY);
        }
        
        // 轻松添加ELEMENT 2,不会报错
        elementsList.add(new Element(22, 42, 2));
        Element element2 = elementsList.get(2);
        System.out.println("posX for " + element2.elementNumber + " is: " + element2.posX);
        System.out.println("posY for " + element2.elementNumber + " is: " + element2.posY);
        
        // 还能继续添加更多元素,完全不用操心容量问题
        elementsList.add(new Element(23, 43, 3));
        elementsList.add(new Element(24, 44, 4));
        
        System.out.println("Program ends here.");
    }
}

方案二:手动扩容数组(不推荐,仅作原理参考)

如果你一定要用原生数组,就得自己手动实现扩容逻辑:创建一个更大的新数组,把原数组的元素复制过去,再替换原数组的引用,之后才能添加新元素。示例代码如下:

public class Main {
    public static void main(String[] args) {
        Element[] arrayOfElements = new Element[2];
        
        // 创建ELEMENT 0和ELEMENT 1
        for (int i = 0; i < 2; i++) {
            System.out.println("Setting " + i + " element");
            arrayOfElements[i] = new Element(i + 20, i + 40, i);
            System.out.println("posX for " + arrayOfElements[i].elementNumber + " is: " + arrayOfElements[i].posX);
            System.out.println("posY for " + arrayOfElements[i].elementNumber + " is: " + arrayOfElements[i].posY);
        }
        
        // 手动扩容:创建长度+1的新数组
        Element[] newArray = new Element[arrayOfElements.length + 1];
        // 复制原数组的所有元素到新数组
        System.arraycopy(arrayOfElements, 0, newArray, 0, arrayOfElements.length);
        // 替换原数组引用
        arrayOfElements = newArray;
        
        // 现在可以安全添加ELEMENT 2了
        arrayOfElements[2] = new Element(22, 42, 2);
        System.out.println("posX for " + arrayOfElements[2].elementNumber + " is: " + arrayOfElements[2].posX);
        System.out.println("posY for " + arrayOfElements[2].elementNumber + " is: " + arrayOfElements[2].posY);
        
        System.out.println("Program ends here.");
    }
}

这种方式需要每次添加元素前都检查容量、手动复制,非常繁琐,所以除非有特殊需求,否则强烈建议用ArrayList。

内容的提问来源于stack exchange,提问作者Jakub Honczaruk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:32:47