我有两个包含相同对象的列表.如何在不更改另一个列表的情况下更改一个列表?

use*_*101 2 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()));
Run Code Online (Sandbox Code Playgroud)

Rad*_*FID 5

这两个列表引用了同一个对象.所以,如果你改变第一个,第二个也会改变.

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

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

1-复制构造函数:

class HistoricRate {
  private String field;

  public HistoricRate (HistoricRate another) {
    this.field= another.field; // you can access  
  }
}
Run Code Online (Sandbox Code Playgroud)

2- HistoricRate必须实现Cloneable接口

实现方法clone以复制对象.

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

for (HistoricRate rate : rates){
    listOfRates.add(rate);
    inverseListOfRates.add(SerializationUtils.clone(rate));
}
Run Code Online (Sandbox Code Playgroud)