我有一个班级,我正在采用类似
的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();
答案 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
中的对象创建了完全相同的副本。因此lstMyClassTemp
和lstMyClass
引用不同的列表,但这两个列表包含对相同对象的引用。因此,当你这样做时:
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());
}
主要部分是克隆