假设我有一个名为Index
的对象,此对象有两个属性Long id; , String name;
,我的页面中有两个ArrayLists
,问题是当我编辑名称时第一个列表中的索引对象也在第二个列表中编辑,这是我的代码,使问题更容易理解:
Index index1 = new Index();
index1.setName("1");
index1.setId(1);
List<Index> indexes = new ArrayList<Index>();
indexes.add(index1);
List<Index> newIndexes = new ArrayList<Index>();
newIndexes.add(index1);
现在,如果我更新indexes
列表中的索引名称,则会在newIndexes
列表中更新。注意:对象索引在Id
字段上具有等于方法。
由于
答案 0 :(得分:0)
这是因为您将同一个对象添加到两个列表中或更精确...您将同一对象的引用添加到两个列表中。
因此,当您更新一个列表中的对象时,它会在第二个列表中更新,因为它是同一个对象。
在将对象添加到第二个列表之前创建该对象的副本,例如使用copy constructor。
答案 1 :(得分:0)
这是因为index1
只是对象的引用。所以,你基本上都是在两个列表中添加相同的引用。您需要在添加到第二个列表之前复制该对象。
答案 2 :(得分:0)
将对象添加到两个列表时,该对象的引用将复制到列表中。这就是为什么当你从一个列表中反对对象时,它会反映在另一个列表中。为避免这种情况,您需要创建对象的副本并将其添加到其他列表中,以便两者都不引用同一对象。
答案 3 :(得分:0)
这种情况正在发生,因为当您在数组列表(以及几乎每个数据集合对象)中使用“添加”时,集合会将对象的“引用”添加到其列表中,而不是创建新对象。
因此,当index1
和indexes
处的newIndexes
个对象基本相同时。无论在何处更换它,它都会在另一方面进行更改。
答案 4 :(得分:0)
两个列表的引用index1
相同,因此更改引用的Index
将会更改它们。
克隆List
本身不会解决您的问题,因为它会克隆List
但不会克隆其元素。
您需要执行List
和元素的深层克隆(或初始化新的ArrayList
,然后克隆上一个{ {1}}的元素)来解决你的问题。
请参阅here了解操作方法。