猿问

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

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

我正在向ArrayList添加三个不同的对象,但该列表包含我添加的最后一个对象的三个副本。


例如:


for (Foo f : list) {

  System.out.println(f.getValue());

}    

预期:


0

1

2

实际:


2

2

2

我犯了什么错误?


注意:这是针对本网站上出现的众多类似问题的规范问答。


互换的青春
浏览 557回答 4
4回答

HUWWW

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

犯罪嫌疑人X

每次将对象添加到ArrayList时,请确保添加新对象而不是已使用的对象。发生的事情是,当您添加相同的1个对象副本时,该相同的对象将添加到ArrayList中的不同位置。当您对其中一个进行更改时,由于反复添加相同的副本,所有副本都会受到影响。例如,假设你有一个像这样的ArrayList:ArrayList<Card>&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList<Card>();Card&nbsp;c&nbsp;=&nbsp;new&nbsp;Card();现在,如果您将此卡c添加到列表中,它将添加没有问题。它将保存在位置0.但是,当您在列表中保存相同的卡片c时,它将保存在位置1.因此请记住,您将相同的1个对象添加到列表中的两个不同位置。现在,如果您对Card对象c进行更改,位于0和1的列表中的对象也将反映该更改,因为它们是同一个对象。一种解决方案是在Card类中创建一个接受另一个Card对象的构造函数。然后在该构造函数中,您可以设置如下属性:public&nbsp;Card(Card&nbsp;c){this.property1&nbsp;=&nbsp;c.getProperty1();this.property2&nbsp;=&nbsp;c.getProperty2();&nbsp;...&nbsp; //add&nbsp;all&nbsp;the&nbsp;properties&nbsp;that&nbsp;you&nbsp;have&nbsp;in&nbsp;this&nbsp;class&nbsp;Card&nbsp;this&nbsp;way}并且假设您拥有相同的1份卡片,因此在添加新对象时,您可以这样做:list.add(new&nbsp;Card(nameOfTheCardObjectThatYouWantADifferentCopyOf));
随时随地看视频慕课网APP

相关分类

Java
我要回答