当前位置: 首页 > 面试题库 >

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

聂和宜
2023-03-14
问题内容

为什么我添加到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中添加三个不同的对象,但该列表包含我添加的最后一个对象的三个副本。 例如: 预期: 实际: 我犯了什么错误? 注意:这是针对本网站上出现的众多类似问题而设计的一个规范问答。

  • 问题内容: 下面有一个for循环代码。我通过调用一个自定义显示函数发现aBook arrayList对象仅添加了最后一个类对象三次。为什么会这样呢? 这是我的LiFiAddressBook类 } 问题答案: 由于使用static关键字,每次 调用构造函数时,旧值都会被新值覆盖,并且在打印列表中的元素时,LiFiAddressBook类的对象变量将指向相同的对象。因此打印相似的对象。 需要明确的是,

  • 问题内容: 我正在尝试将名为 City 的 类的 对象添加到中。这是该类的代码 __ 这是我的 主班 的代码 __ 的结果始终相同,并且似乎 数组列表 仅存储添加到其所有元素中的最后一个对象。 例如,运行程序时得到的结果是: 为什么我得到那个结果?我该如何解决? 提前致谢! 问题答案: 在和变量被标记为。甲构件跨过的所有实例共享,并且因此是一个全局变量。您需要对代码进行几处更改: 将city中的和

  • 问题内容: 我只是想知道… 为什么我只有一个Calendar对象实例。有一个单例的原因吗? 我试图阅读文档,但他们没有提及为什么需要这样做。快速谷歌搜索没有给我任何答案。 问题答案: 日历不是单例,它是一个抽象类。该方法是一个Factory方法,它返回Calendar类的具体实现。 在Google上搜索java.util.Calendar源代码,您将看到它的工作方式。

  • 我是java新手,我正试图编写我的第一个“更大”的程序,包含几个类。我在类“CompetitionProgram”中创建了一个ArrayList并将其声明为private。 我的程序中需要这两个类(Event&ListOfEvents),这是需求之一。事件--它只是表示事件本身,比如事件名称和尝试次数(它是一个体育事件)。和ListOfEvents--它表示列表本身,并包含用于添加事件、删除事件和

  • 如果一个表达式包含任何整数大小或更小的内容,其结果总是整数,即使两个字节之和适合一个字节。 为什么我们在一个字节中添加最后两个字节时会发生这种情况?没有编译器错误。