Java 在一个变量中更改值,而在另一个变量中立即更改错误
我有一个班,我拿了两个这样的例子Java 在一个变量中更改值,而在另一个变量中立即更改错误,java,class,arraylist,Java,Class,Arraylist,我有一个班,我拿了两个这样的例子 List<MyClass> lstMyClassTemp; List<MyClass> lstMyClass = new ArrayList<MyClass>(); 现在的问题是,在运行更新函数之前,当我更改lstMyClass变量中的某个值时,lstmyclastemp变量的值会立即更改,但不是真的 请让我知道什么部分会造成问题 编辑和更新 谢谢你的回答 您的回答在继续中很有用。当我更改lstMyClass中的值时,我会
List<MyClass> lstMyClassTemp;
List<MyClass> lstMyClass = new ArrayList<MyClass>();
现在的问题是,在运行更新函数之前,当我更改lstMyClass
变量中的某个值时,lstmyclastemp
变量的值会立即更改,但不是真的
请让我知道什么部分会造成问题
编辑和更新
谢谢你的回答
您的回答在继续中很有用。当我更改lstMyClass
中的值时,我会遇到新的错误和问题lstmyclastemp
中的值会立即更改哪个部分会产生问题
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();
lstmyclastemp=newarraylist();
对于(i=0;i
您的问题是,您使用的创建方法将引用传递给变量,而不是简单地复制它。由于Java没有指针,您必须自己手动复制它。下面是一个例子,说明您可能如何做到这一点
lstMyClassTemp = new ArrayList<MyClass>();
for (i = 0; i < lstMyClass.size; i++) {
lstMyClassTemp.add((MyClass)lstMyClass.get(i));
}
lstmyclastemp=newarraylist();
对于(i=0;i
您的问题是,您使用的创建方法将引用传递给变量,而不是简单地复制它。由于Java没有指针,您必须自己手动复制它。下面是一个例子,说明您可能如何做到这一点
lstMyClassTemp = new ArrayList<MyClass>();
for (i = 0; i < lstMyClass.size; i++) {
lstMyClassTemp.add((MyClass)lstMyClass.get(i));
}
lstmyclastemp=newarraylist();
对于(i=0;i
数组列表的复制构造函数只复制ols数组列表的直接内容。它不执行ArrayList内对象的深度复制。调用复制构造函数与以下操作相同:
List<MyClass> lstMyClassTemp = new ArrayList<>();
for(MyClass m: lstMyClass){
lstMyClassTemp.add(m);
}
List lstmyclastemp=new ArrayList();
对于(MyClass m:lstMyClass){
lstmyclastemp.add(m);
}
因此,新ArrayList包含与旧ArrayList相同的
MyClass
类型的对象引用,但仍然只包含引用 ArrayList的复制构造函数只复制ols ArrayList的直接内容。它不执行ArrayList内对象的深度复制。调用复制构造函数与以下操作相同:
List<MyClass> lstMyClassTemp = new ArrayList<>();
for(MyClass m: lstMyClass){
lstMyClassTemp.add(m);
}
List lstmyclastemp=new ArrayList();
对于(MyClass m:lstMyClass){
lstmyclastemp.add(m);
}
因此,新ArrayList包含与旧ArrayList相同的MyClass
类型的对象引用,但仍然只包含引用 执行此操作时:
lstMyClassTemp= new ArrayList<MyClass>(lstMyClass);
然后您必须记住,lstMyClass.get(j)
返回对与lstmyclastemp.get(j)
相同对象的引用。不是对象的副本,而是同一个实际对象。因此,当您设置该对象的名称时,您可以通过同时使用lstMyClass.get(j)
和lstmyclastemp.get(j)
来查看更改,因为它们是相同的对象。执行此操作时:
lstMyClassTemp= new ArrayList<MyClass>(lstMyClass);
然后您必须记住,
lstMyClass.get(j)
返回对与lstmyclastemp.get(j)
相同对象的引用。不是对象的副本,而是同一个实际对象。因此,当您设置该对象的名称时,您可以通过同时使用lstMyClass.get(j)
和lstmyclastemp.get(j)
来查看更改,因为它们是同一个对象。最后,我找到了一种简单而有用的方法,我把它放在这里,希望下次能有所帮助:)
在主体代码中:
ArrayList<MyClass> lstMyClassTemp= new ArrayList<MyClass>();
ArrayList<MyClass> lstMyClass= new ArrayList<MyClass>();
for(MyClass m: lstMyClass){
lstMyClassTemp.add((MyClass)m.clone());
}
ArrayList lstmyclastemp=new ArrayList();
ArrayList lstMyClass=新的ArrayList();
对于(MyClass m:lstMyClass){
lstmyclastemp.add((MyClass)m.clone());
}
主要部分是克隆
最后,我找到了一种简单实用的方法,我把它放在这里,希望下次能有所帮助:) 在主体代码中:
ArrayList<MyClass> lstMyClassTemp= new ArrayList<MyClass>();
ArrayList<MyClass> lstMyClass= new ArrayList<MyClass>();
for(MyClass m: lstMyClass){
lstMyClassTemp.add((MyClass)m.clone());
}
ArrayList lstmyclastemp=new ArrayList();
ArrayList lstMyClass=新的ArrayList();
对于(MyClass m:lstMyClass){
lstmyclastemp.add((MyClass)m.clone());
}
主要部分是克隆
当您更改lstMyClass中的某些值时,lstMyClassTemp变量的值会更改,但它不是真的吗?添加您的代码或添加更多信息。您写道:或者更改lstMyClass中的某些内容,我将更新temp变量lstmyclastemp的值。。。那么问题出在哪里呢?感谢您的关注,想象一下MYClass包含id、名称、承包商的状态,通过代码获取和设置方法,比如for(p=0;p<5;p++){if(lstmyclastemp.get(p.getState()==true)lstMyClass.get(p.setState)(false);tempFlag=true}在此之后,如果tempFlag为true,我将调用update函数,但问题出现在第一个条件中,如果在调用update()之前为true,则temp变量changetanks可供您帮助,但我的代码中有一个新问题,我不明白为什么;)当您更改lstMyClass中的某些值时,lstmyclastemp变量的值会更改,但它不是真的吗?添加您的代码或添加更多信息。您写道:或者更改lstMyClass中的某些内容,我将更新temp变量lstmyclastemp的值。。。那么问题出在哪里呢?感谢您的关注,想象一下MYClass包含id、名称、承包商的状态,通过代码获取和设置方法,比如for(p=0;p<5;p++){if(lstmyclastemp.get(p.getState()==true)lstMyClass.get(p.setState)(false);tempFlag=true}在此之后,如果tempFlag为true,我将调用update函数,但问题出现在第一个条件中,如果在调用update()之前为true,则temp变量changetanks可供您帮助,但我的代码中有一个新问题,我不明白为什么;)谢谢,我编辑了和平的代码实际上我需要一个临时列表,我的最后一个值,以检查这些值在这个条件