当我只将对象放入 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/