Java 为什么即使我没有更改或设置任何值,全局列表也会受到影响?
这是我的示例对象Java 为什么即使我没有更改或设置任何值,全局列表也会受到影响?,java,list,arraylist,Java,List,Arraylist,这是我的示例对象 对象名称:OBJ 对象属性:字符串名称、整数 现在我有两个全局列表 List<OBJ> lstobj = new ArrayList<OBJ>; List<OBJ> anotherlist = new ArrayList<OBJ>; 现在我需要将检索到的obj的年龄设置为10岁 newobj.setAge(10) 此操作不仅会更改“lstobj”,还会更改“另一个列表”。如何设置检索到的obj而不影响两个全局列表?列表存储对对象
对象名称:OBJ
对象属性:字符串名称、整数
现在我有两个全局列表
List<OBJ> lstobj = new ArrayList<OBJ>;
List<OBJ> anotherlist = new ArrayList<OBJ>;
现在我需要将检索到的obj的年龄设置为10岁
newobj.setAge(10)代码>
此操作不仅会更改“lstobj”,还会更改“另一个列表”。如何设置检索到的obj而不影响两个全局列表?列表存储对对象的引用。如果将同一个引用粘贴到多个列表中,然后更改对象,则对象将到处更改
如果希望lstobj
和anotherlist
的内容彼此完全独立,则需要在其中插入不同的对象。这可能需要复制对象。尝试使用复制构造函数
public class Person {
private String name;
private String age;
public Person(String name,String age) {
this.name = name;
this.age = age;
}
public Person(Person person){
this.name = person.getName();
this.age= person.getAge();
}
public Person(){
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "[Name:"+this.name+"][Age:"+this.age+"]";
}
public static void main(String[] args) {
Person person1 = new Person("Charles","20");
Person person2 = new Person("Rob","30");
List<Person> persons = new ArrayList<Person>();
persons.add(person1);
persons.add(person2);
List<Person> morePersons = new ArrayList<Person>();
morePersons.add(new Person(person1));
morePersons.add(new Person(person2));
Person newobj = new Person();
for (Person obj : persons) {
if (obj.getName().equals("Charles")) {
newobj = obj;
newobj.setAge("10");
}
}
System.out.println(persons);
System.out.println("======");
System.out.println(morePersons);
}
}
在本例中,您只修改一个对象,但同时反映在两个列表中。
这是因为列表存储对象引用,在这里,两个列表都引用您正在修改的同一个对象,所以您所做的更改将反映在两个列表中
我在这里做的是复制对象的细节并创建一个新对象,它的引用与原始对象不同。
您在旧对象中所做的任何更改都不会更改新对象,因为它们具有不同的引用如何添加记录?请参见:,您需要对象i添加记录,如此OBJ示例=新OBJ;sample.setName(“samplename”);样品设置(10);好的,谢谢。但是如果我只有lstobj呢。每当我设置从lstobj检索到的记录的年龄时。lstobj也发生了变化,我还尝试按如下属性获取记录'OBJ newobj=newobj;对于(OBJ-OBJ:lstobj){if(OBJ.getName.equals)(“Charles”){newobj.setName(OBJ.getName);newobj.setAge(OBJ.getAge);}}}}它成功了。感谢大家的帮助:我还尝试通过如下属性获取记录:OBJ-newobj=newobj;对于(OBJ-OBJ-OBJ:lstobj){if(OBJ.getName.equals)(“Charles”){newobj.setName(OBJ.getName);newobj.setAge(obj.getAge);}}}它成功了。谢谢大家的帮助:D
public class Person {
private String name;
private String age;
public Person(String name,String age) {
this.name = name;
this.age = age;
}
public Person(Person person){
this.name = person.getName();
this.age= person.getAge();
}
public Person(){
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "[Name:"+this.name+"][Age:"+this.age+"]";
}
public static void main(String[] args) {
Person person1 = new Person("Charles","20");
Person person2 = new Person("Rob","30");
List<Person> persons = new ArrayList<Person>();
persons.add(person1);
persons.add(person2);
List<Person> morePersons = new ArrayList<Person>();
morePersons.add(new Person(person1));
morePersons.add(new Person(person2));
Person newobj = new Person();
for (Person obj : persons) {
if (obj.getName().equals("Charles")) {
newobj = obj;
newobj.setAge("10");
}
}
System.out.println(persons);
System.out.println("======");
System.out.println(morePersons);
}
}
run:
[[Name:Charles][Age:10], [Name:Rob][Age:30]]
======
[[Name:Charles][Age:20], [Name:Rob][Age:30]]
BUILD SUCCESSFUL (total time: 1 second)