更改变量中的值并在其他变量中立即更改错误

时间:2015-12-17 22:09:51

标签: java class arraylist

我有一个班级,我正在采用类似

的2个实例形式
List<MyClass> lstMyClassTemp;

List<MyClass> lstMyClass = new ArrayList<MyClass>();

在初始某个值之后或更改lstMyClass中的某些内容我将通过函数Update()更新临时变量 lstMyClassTemp 的值

private void update1()
{
   lstMyClassTemp = new ArrayList<MyClass>(lstMyClass);
}

现在我的问题出现在我运行update函数之前,当我在lstMyClass变量中更改某个值时,lstMyClassTemp变量的值立即改变但是它不是真的 请让我知道哪个部分可能会出问题

修改和更新

感谢您的回答

我的答案非常有用继续我在lstMyClass更改lstMyClassTemp中的值时会立即出现新的错误和问题,哪个部分可能会出现问题?

lstMyClassTemp = new ArrayList<MyClass>();

for (i = 0; i < lstMyClass.size; i++) {
    lstMyClassTemp.add((MyClass)lstMyClass.get(i));
}

// ... other code ...

int rowIStr=0;

for (int j = 0; j < 5; j++) {
    if(lstMyClassTemp .get(j).getTempName().equals(lstMyClassTemp.get(rowIStr).getName()))
        lstMyClass.get(j).setName("Alex");
}
rowIStr++

// ... other code ...

update1();

4 个答案:

答案 0 :(得分:2)

ArrayList的拷贝构造函数只复制ols ArrayList的直接内容。它不会对ArrayList中的对象执行深层复制。调用复制构造函数与:

相同
List<MyClass> lstMyClassTemp = new ArrayList<>();
for(MyClass m: lstMyClass){
    lstMyClassTemp.add(m);
}

因此新的ArrayList包含与旧类型MyClass类型的对象相同的引用,但仍然只引用。

答案 1 :(得分:1)

执行此操作时:

lstMyClassTemp= new ArrayList<MyClass>(lstMyClass);

您在引用lstMyClassTemp中为lstMyClass中的对象创建了完全相同的副本。因此lstMyClassTemplstMyClass引用不同的列表,但这两个列表包含对相同对象的引用。因此,当你这样做时:

lstMyClass.get(j).setName("Alex");

然后您必须记住lstMyClass.get(j)返回与lstMyClassTemp.get(j)相同的对象的引用。不是对象的副本,而是相同的实际对象。因此,当您设置该对象的名称时,您可以同时使用lstMyClass.get(j)lstMyClassTemp.get(j)来查看更改,因为它们是同一个对象。

答案 2 :(得分:0)

您的问题是您使用的创建方法将引用传递给变量而不是简单地复制它。由于Java没有指针,您必须自己手动复制它。以下是您如何做到这一点的一个例子。

lstMyClassTemp = new ArrayList<MyClass>();

for (i = 0; i < lstMyClass.size; i++) {
  lstMyClassTemp.add((MyClass)lstMyClass.get(i));
}

答案 3 :(得分:0)

最后,我找到了一种简单实用的方法,我将它放在这里,希望它能再次有用:)

public class MyClass implements Cloneable {

/** some method  ***/

    public Object clone() {  
        try { 
       return super.clone(); 

        } catch (CloneNotSupportedException e) { 

            e.printStackTrace();  
            return null; 
        } 
     } 
} 

在主体代码中:

ArrayList<MyClass> lstMyClassTemp= new ArrayList<MyClass>();
ArrayList<MyClass> lstMyClass= new ArrayList<MyClass>();
for(MyClass m: lstMyClass){
lstMyClassTemp.add((MyClass)m.clone()); 
}

主要部分是克隆

image description here