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
相关产品推荐
相关产品推荐

