为什么我的ArrayList包含添加到列表中的最后一项的N个副本?我正在向ArrayList添加三个不同的对象,但该列表包含我添加的最后一个对象的三个副本。例如:for (Foo f : list) { System.out.println(f.getValue());} 预期:012实际:222我犯了什么错误?注意:这是针对本网站上出现的众多类似问题的规范问答。
4 回答

HUWWW
TA贡献1874条经验 获得超12个赞
您的问题是static
每次迭代循环时需要新初始化的类型。如果您处于循环中,最好将具体初始化保留在循环内。
List<Object> objects = new ArrayList<>(); for (int i = 0; i < length_you_want; i++) { SomeStaticClass myStaticObject = new SomeStaticClass(); myStaticObject.tag = i; // Do stuff with myStaticObject objects.add(myStaticClass);}
代替:
List<Object> objects = new ArrayList<>(); SomeStaticClass myStaticObject = new SomeStaticClass();for (int i = 0; i < length; i++) { myStaticObject.tag = i; // Do stuff with myStaticObject objects.add(myStaticClass); // This will duplicate the last item "length" times}
这tag
是一个SomeStaticClass
用于检查上述代码段有效性的变量; 您可以根据您的用例进行其他实现。

犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
每次将对象添加到ArrayList时,请确保添加新对象而不是已使用的对象。发生的事情是,当您添加相同的1个对象副本时,该相同的对象将添加到ArrayList中的不同位置。当您对其中一个进行更改时,由于反复添加相同的副本,所有副本都会受到影响。例如,假设你有一个像这样的ArrayList:
ArrayList<Card> list = new ArrayList<Card>();Card c = new Card();
现在,如果您将此卡c添加到列表中,它将添加没有问题。它将保存在位置0.但是,当您在列表中保存相同的卡片c时,它将保存在位置1.因此请记住,您将相同的1个对象添加到列表中的两个不同位置。现在,如果您对Card对象c进行更改,位于0和1的列表中的对象也将反映该更改,因为它们是同一个对象。
一种解决方案是在Card类中创建一个接受另一个Card对象的构造函数。然后在该构造函数中,您可以设置如下属性:
public Card(Card c){this.property1 = c.getProperty1();this.property2 = c.getProperty2(); ... //add all the properties that you have in this class Card this way}
并且假设您拥有相同的1份卡片,因此在添加新对象时,您可以这样做:
list.add(new Card(nameOfTheCardObjectThatYouWantADifferentCopyOf));
添加回答
举报
0/150
提交
取消