在java中更新类似的对象

时间:2013-12-02 07:43:58

标签: java object arraylist

假设我有一个名为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字段上具有等于方法。

由于

5 个答案:

答案 0 :(得分:0)

这是因为您将同一个对象添加到两个列表中或更精确...您将同一对象的引用添加到两个列表中。

因此,当您更新一个列表中的对象时,它会在第二个列表中更新,因为它是同一个对象。

在将对象添加到第二个列表之前创建该对象的副本,例如使用copy constructor

答案 1 :(得分:0)

这是因为index1只是对象的引用。所以,你基本上都是在两个列表中添加相同的引用。您需要在添加到第二个列表之前复制该对象。

答案 2 :(得分:0)

将对象添加到两个列表时,该对象的引用将复制到列表中。这就是为什么当你从一个列表中反对对象时,它会反映在另一个列表中。为避免这种情况,您需要创建对象的副本并将其添加到其他列表中,以便两者都不引用同一对象。

答案 3 :(得分:0)

这种情况正在发生,因为当您在数组列表(以及几乎每个数据集合对象)中使用“添加”时,集合会将对象的“引用”添加到其列表中,而不是创建新对象。 因此,当index1indexes处的newIndexes个对象基本相同时。无论在何处更换它,它都会在另一方面进行更改。

答案 4 :(得分:0)

两个列表的引用index1相同,因此更改引用的Index将会更改它们。

克隆List本身不会解决您的问题,因为它会克隆List但不会克隆其元素。

您需要执行List 元素的深层克隆(或初始化新的ArrayList,然后克隆上一个{ {1}}的元素)来解决你的问题。

请参阅here了解操作方法。