为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的ArrayList包含添加到列表中的最后一项的N个副本?

为什么我的ArrayList包含添加到列表中的最后一项的N个副本?

互换的青春 2019-05-22 14:59:09
为什么我的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用于检查上述代码段有效性的变量; 您可以根据您的用例进行其他实现。


查看完整回答
反对 回复 2019-05-22
?
犯罪嫌疑人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));


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 556 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号