2

这是我的示例对象
object name: OBJ
object properties: String name, int age

现在我有 2 个全局列表

List<OBJ> lstobj = new ArrayList<OBJ>;
List<OBJ> anotherlist = new ArrayList<OBJ>;

然后我像这样在两个列表中添加了一些记录

Name:Ben Age:5
Name:Charles Age: 6
Name:Dan Age:7

现在我需要将查尔斯的年龄改为“10”

所以首先我应该在列表中找到 Charles 并从列表中获取 obj

OBJ newobj = new OBJ;
for(OBJ obj : lstobj){
  if(obj.getName.equals("Charles"){
    newobj = obj;
   }
}

现在我需要将检索到的 obj 的年龄设置为 10。

newobj.setAge(10);

此操作不仅会更改“lstobj”,还会更改“anotherlist”。如何在不影响两个全局列表的情况下设置检索到的 obj?

4

2 回答 2

6

列表存储对对象的引用。如果您将相同的引用粘贴到多个列表中,然后更改对象,它会随处更改。

如果您希望 和 的内容lstobj彼此anotherlist完全独立,则需要在其中插入不同的对象。这可能涉及复制您的对象。

于 2013-01-24T09:03:43.787 回答
4

尝试使用复制构造函数

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)

在您的情况下,您只修改一个对象,但反映在两个列表中。这是因为列表存储对象引用,这里两个列表都引用您正在修改的同一对象,因此您所做的更改会反映在两个列表中。

我在这里所做的是我正在复制对象详细信息并创建一个新对象,并且它的引用与原始对象不同。您在旧对象中所做的任何更改都不会更改新对象,因为它们具有不同的引用

于 2013-01-24T09:08:55.523 回答