Java修改List的一个对象另一个对象也变

在Java中,当我们在一个List中存储对象时,有时候会遇到一个对象被修改后,List中的其他对象也会跟着变化的情况。这是因为List存储的是对象的引用,而不是对象本身。本文将详细介绍这个问题,并提供示例代码来解释这个现象。

问题描述

当我们将一个对象存储到List中时,实际上存储的是对象的引用。引用是指向对象的指针,它指示了对象在内存中的位置。因此,当我们修改通过引用访问到的对象时,List中存储的引用也会指向被修改的对象,从而导致List中的其他对象也发生变化。

示例代码

下面是一个示例,展示了List中的一个对象被修改后,其他对象也发生变化的情况:

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("Alice");
        Person person2 = new Person("Bob");

        personList.add(person1);
        personList.add(person2);

        Person person3 = personList.get(0);
        person3.setName("Charlie");

        System.out.println(personList.get(0).getName()); // Output: Charlie
        System.out.println(personList.get(1).getName()); // Output: Bob
    }
}

在上面的代码中,我们创建了一个Person类,它有一个name属性和相应的访问方法。我们创建了一个personList来存储Person对象,并向其中添加了两个对象person1person2

接下来,我们从列表中获取了第一个对象,并将其引用保存在person3变量中。然后,我们通过person3引用修改了Person对象的name属性。当我们打印personList中的所有对象的name属性时,我们发现第一个对象的name属性已经被修改为Charlie,而第二个对象的name属性仍然是Bob

这是因为person3引用指向了personList中的第一个对象,所以对person3的修改实际上是对personList中的第一个对象的修改。因此,当我们访问personList中的第一个对象时,我们看到的是修改后的值。

解决方法

如果我们不希望通过修改一个对象的引用来影响List中的其他对象,可以采用以下解决方法之一:

  • 使用克隆:在将对象存储到List中之前,使用对象的克隆副本来存储。这样,当我们修改副本时,List中原始对象的引用不会受到影响。
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");

personList.add(person1.clone());
personList.add(person2.clone());
  • 创建新对象:在修改一个对象时,创建一个新的对象来替代原始对象。这样,List中其他对象的引用不会受到影响。
Person newPerson = new Person(person3.getName());
personList.set(0, newPerson);

这些解决方法可以根据具体情况来选择,并根据需求进行实现。

总结

在Java中,当我们修改List中一个对象的属性时,其他对象也会受到影响。这是因为List存储的是对象引用,而不是对象本身。为了避免这个问题,我们可以使用克隆或创建新对象的方法来解决。

希望通过本文的介绍,你对Java中修改List中对象的影响有了更好的理解,并能够找到适合自己的解决方法。

请参考下方关系图和状态图:

关系图

erDiagram
    Person }|..|| Main : has

状态图

stateDiagram
    [*] --> Person
    Person