Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我有两个包含相同对象的列表。如何更改一个列表而不更改另一个?_Java_List_Object_Deep Copy_Shallow Copy - Fatal编程技术网

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

Java 我有两个包含相同对象的列表。如何更改一个列表而不更改另一个?,java,list,object,deep-copy,shallow-copy,Java,List,Object,Deep Copy,Shallow Copy,我第一次注意到这个问题时,我只把对象放在listOfRates中,然后通过复制它来创建inverseListOfRates。但即使使用这种方法,我也无法在不改变另一个列表的情况下改变其中一个列表 我如何解决这个问题 List<HistoricRate> listOfRates = new ArrayList<HistoricRate>(); List<HistoricRate> inverseListOfRates = new ArrayList<His

我第一次注意到这个问题时,我只把对象放在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()));
List listOfRates=new ArrayList();
List inverseListOfRates=new ArrayList();
用于(装箱费率:费率){
费率列表。添加(费率);
逆比例相加(比率);
}
forEach(r->r.setMid(1/r.getMid());

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

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

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

1-复制构造函数:

class HistoricRate {
  private String field;

  public HistoricRate (HistoricRate another) {
    this.field= another.field; // you can access  
  }
}
for (HistoricRate rate : rates){
    listOfRates.add(rate);
    inverseListOfRates.add(SerializationUtils.clone(rate));
}
2-Historicate必须实现可克隆接口

实现克隆方法以复制对象

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

class HistoricRate {
  private String field;

  public HistoricRate (HistoricRate another) {
    this.field= another.field; // you can access  
  }
}
for (HistoricRate rate : rates){
    listOfRates.add(rate);
    inverseListOfRates.add(SerializationUtils.clone(rate));
}

你需要熟悉浅拷贝和深拷贝

由于两个数组列表指向堆上完全相同的对象,因此数组如下所示

修改一个速率圆(对象)时,由于另一个列表在其相应索引中指向完全相同的对象,因此它将看到您对另一个列表所做的更改

您需要为Historicate类定义一个复制构造函数,该类将:

public HistoricRate(HistoricRate other){
 this.data = other.data;
 //copy the other instance variables here
}
然后,当您将历史箱添加到列表中时,您可以添加

listOfRates.add(new HistoricRate( currentRate ) );
由于您正在使用“新建”,列表将接收新对象,对其中一个对象的更改不会影响另一个对象。它将看起来像这样: