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)