java - 我有两个包含相同对象的列表。如何更改一个列表而不更改另一个列表?

标签 java list object deep-copy shallow-copy

当我只将对象放入 listOfRates 中,然后通过复制它来创建 inverseListOfRates 时,我第一次注意到这个问题。但即使使用这种方法,我也无法在不改变另一个列表的情况下改变一个列表。

如何解决这个问题?

List<HistoricRate> listOfRates = new ArrayList<HistoricRate>();
List<HistoricRate> inverseListOfRates = new ArrayList<HistoricRate>();

for (HistoricRate rate : rates){
    listOfRates.add(rate);
    inverseListOfRates.add(rate);
}

inverseListOfRates.forEach(r -> r.setMid(1 / r.getMid()));

最佳答案

这两个列表引用同一个对象。因此,如果你改变第一个,第二个也会改变。

解决方案是在将对象添加到第二个列表之前克隆该对象(将其副本创建到新实例中)。

要克隆对象,您可以使用以下建议之一:

1- 复制构造函数:

class HistoricRate {
  private String field;

  public HistoricRate (HistoricRate another) {
    this.field= another.field; // you can access  
  }
}

2- HistoricRate 必须实现 Cloneable 接口(interface)

实现方法clone来复制对象。

3-使用 org.apache.commons.lang.SerializationUtils 如下:

for (HistoricRate rate : rates){
    listOfRates.add(rate);
    inverseListOfRates.add(SerializationUtils.clone(rate));
}

关于java - 我有两个包含相同对象的列表。如何更改一个列表而不更改另一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38087775/

相关文章:

javascript - 如何按照数组元素的顺序从数组创建对象

java - 从键中删除特定值(HashMap)

java - Camel Java DSL Route with Choice 仅针对最后一个条件进行

python - 在文本框 python 中以特定格式插入列表中的值

Python:给定一个列表列表,创建一个按内部列表出现次数排序的列表

java - 获取List的Arraylist中与Arraylist匹配的数据

javascript - 将函数的返回值分配给React Native中的对象属性

java - 通用节点是否需要成为通用列表的一部分?

java - 如何在 Processing 3+ 中使用 JTransforms 库

java - Java 中的自实例化