为什么我添加到ArrayList中对象只包N个最后一个元素?

为什么我添加到ArrayList中对象只包N个最后一个元素?

回答:

此问题有两个典型的原因:

  • 你存储在列表中的对象使用的静态字段

  • 意外将同一对象添加到列表

静态场

如果列表中的对象将数据存储在静态字段中,则列表中的每个对象将看起来是相同的,因为它们具有相同的值。考虑下面的类:

public class Foo {

private static int value;

// ^^^^^^------------ - Here's the problem!

public Foo(int value) {

this.value = value;

}

public int getValue() {

return value;

}

}

在该示例中,由于声明了int valueFoo因此在所有实例之间只有一个共享static。(请参阅“了解班级成员”教程。)

如果Foo使用以下代码将多个对象添加到列表中,则每个实例都会3从调用返回getValue()

for (int i = 0; i < 4; i++) {      

list.add(new Foo(i));

}

解决方案很简单 static除非你确实希望在该类的每个实例之间共享值,否则不要在类中的字段中使用关键字。

添加相同的对象

如果将临时变量添加到列表,则每次循环时必须创建要添加的对象的新实例。考虑以下错误代码片段:

List<Foo> list = new ArrayList<Foo>();    

Foo tmp = new Foo();

for (int i = 0; i < 3; i++) {

tmp.setValue(i);

list.add(tmp);

}

在这里,tmp对象是在循环外部构造的。结果,同一对象实例被添加到列表中三次。该实例将保留该值2,因为这是在上次调用时传递的值setValue()

要解决此问题,只需在循环内移动对象构造:

List<Foo> list = new ArrayList<Foo>();        

for (int i = 0; i < 3; i++) {

Foo tmp = new Foo(); // <-- fresh instance!

tmp.setValue(i);

list.add(tmp);

}

以上是 为什么我添加到ArrayList中对象只包N个最后一个元素? 的全部内容, 来源链接: utcz.com/qa/429337.html

回到顶部