我无法理解为什么我的代码表现得像它一样。我所做的是创建一个自定义类的ArrayList。填充类对象,然后将其添加到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();
有人可以请你知道发生了什么事吗?
答案 0 :(得分:3)
您只是在ArrayList中添加对象的引用。您稍后修改该对象,因此当然修改了数组列表中的对象(它是同一个对象)。
使用obj_LData = new LiftData();你正在创建一个与ArrayList中的对象不同的新对象,这就是它工作的原因。
LiftData obj_LData = new LiftData();
LiftData obj_LData2 = obj_LData;
这里,obj_LData和obj_LData2指向同一个对象。如果您更改其中一个属性,另一个属性也将更改。
答案 1 :(得分:3)
ArrayList
与所有Java集合一样 - 实际上,Java中的所有变量 - 都包含对对象的引用,而不是对象本身。听起来你只创建了一个LiftData
对象,并且正在为ArrayList
填充多个引用。每次更改数据时,ArrayList
中的每个对象都会发生变化 - 因为它们都是同一个对象。
这与你在C ++中使用基本相同的语法所得到的相反;插入vector
将创建对象的副本,您确实可以修改对象,重新添加它,并在vector
中获取两个不同的对象。但Java并不是那样工作的:对象类型的所有变量本质上都是指针。
在填充列表的循环中,您需要每次都创建一个新的LiftData
对象。
答案 2 :(得分: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);
}