-1

我无法理解为什么我的代码表现得如此。我所做的是创建一个自定义类的 ArrayList。填充类对象,然后将其添加到 ArrayList。然后我重用类对象并用新值填充它并将其添加到 ArrayList 除了第一个被第二个覆盖?是否有某种内部指针或尚未提交的数组列表可能导致这种情况?

在这里我声明我的 ArrayList

private ArrayList<LiftData> arrylst_LiftData = new ArrayList<LiftData>();

然后我创建我的自定义数据对象(只是一个具有一些属性的类)

LiftData obj_LData = new LiftData();

一些未显示的代码用有效数据填充它,我将它添加到 ArrayList

arrylst_LiftData.add(obj_LData);

现在,代码通过循环使用新值填充 obj_LData,然后它被添加到 arraylist 但第一个消失了???

如果我添加 ArrayList 下显示的第二行,则添加一切正常???

arrylst_LiftData.add(obj_LData);
obj_LData = new LiftData();

有人可以告诉我发生了什么吗?

4

3 回答 3

3

您只是在 ArrayList 中添加对对象的引用。您稍后会修改该对象,因此数组列表中的那个当然会被修改(它是同一个对象)。

使用 obj_LData = new LiftData(); 您正在创建一个与 ArrayList 中的不同的新对象,这就是它起作用的原因。

LiftData obj_LData = new LiftData();
LiftData obj_LData2 = obj_LData;

这里,obj_LData 和 obj_LData2 指向同一个对象。如果您更改其中一个的属性,另一个也将被更改。

于 2012-05-16T17:04:59.200 回答
3

ArrayList所有 Java 集合一样——实际上,Java 中的所有变量——都包含对对象的引用,而不是对象本身。听起来您只创建了一个LiftData对象,并且正在填充ArrayList对它的多个引用。每次更改其数据时,其中的每个对象ArrayList都会发生变化——因为它们都是同一个对象。

这与您在 C++ 中使用基本相同的语法所得到的结果形成鲜明对比。插入 avector将创建对象的副本,您确实可以修改对象,重新添加它,并在vector. 但是 Java 不是这样工作的:所有对象类型的变量本质上都是指针。

LiftData在填充列表的循环中,您每次都需要创建一个新对象。

于 2012-05-16T17:05:26.070 回答
1

我认为发生的事情如下:因为您没有“新建”自定义对象,所以您正在更改的变量(对于 ArrayList 的第二个元素)实际上是数组列表中的第一个元素,因为它指向内存中的相同位置(通过引用)。

当你“新建”它时,你会在内存中创建一个新空间,并给它一个新指针。因此,您添加的第一个元素现在指向与您为第二个元素编辑的位置不同的位置。

重用变量很好,但在更改和添加之前需要更新,因为否则指针将相同。

LiftData toAdd;
ArrayList<LiftData> list = new ArrayList<LiftData>();
for (int i=0;i<5;i++) {
   //Without this line here, the pointers to all the elements of the array list will the same.
   //This means that they will have the same values too
   toAdd = new LiftData();
   //init lift data values
   list.add(toAdd);
}
于 2012-05-16T17:07:59.083 回答