Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Class_Arraylist - Fatal编程技术网

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可供您帮助,但我的代码中有一个新问题,我不明白为什么;)谢谢,我编辑了和平的代码实际上我需要一个临时列表,我的最后一个值,以检查这些值在这个条件