为什么对象引用在它存储的集合中也没有改变?

时间:2015-04-12 02:31:09

标签: java oop collections

我正在玩一些代码,我期待不同的结果。例如,如果我有一些Person个对象,并且将相同的对象添加到集合(任何),稍后对其进行修改(一个或多个成员),不应该是该引用应该是在被引用/添加的集合中也进行了更新?

这是我的一段代码"播放"用:

public static void main(String... args) {
  Person robert = new Person("Robert", "Virding", 59);
  Person mike = new Person("Mike", "Williams", 62);
  Person joe = new Person("Joe", "Armstrong", 65);
  List<Person> persons = new LinkedList<>();

  persons.add(robert);
  persons.add(mike);
  persons.add(joe);

  Collection<Person> immutable = Collections.unmodifiableCollection(persons);

  joe = new Person("Joe", "Jonas", 35);
  System.out.printf("[robert] %s%n", robert);
  System.out.printf("[mike] %s%n", mike);
  System.out.printf("[joe] %s%n", joe);
  System.out.printf("[persons] %s%n", persons);
  System.out.printf("[immutable] %s%n", immutable);
}

我的理解是对象joe应该是Person {givenName=Joe, familyName=Jonas, age=35}而不是Person {givenName=Joe, familyName=Armstrong, age=65};但是对于集合中的引用没有发生这种情况。

有什么建议吗?

为了记录,这是我得到的输出:

[robert] Person{givenName=Robert, familyName=Virding, age=59}
[mike] Person{givenName=Mike, familyName=Williams, age=62}
[joe] Person{givenName=Joe, familyName=Jonas, age=35}
[persons] [Person{givenName=Robert, familyName=Virding, age=59}, Person{givenName=Mike, familyName=Williams, age=62}, Person{givenName=Joe, familyName=Armstrong, age=65}]
[immutable] [Person{givenName=Robert, familyName=Virding, age=59}, Person{givenName=Mike, familyName=Williams, age=62}, Person{givenName=Joe, familyName=Armstrong, age=65}]

2 个答案:

答案 0 :(得分:4)

你的列表中有对象[&#34; Joe&#34;,&#34; Armstrong&#34;,65],你的变量引用了第二个[&#34; Joe& #34;,&#34; Jonas&#34;,35]以及那是因为您创建了一个新对象并将其分配给joe。 List没有保留对&#34; joe&#34;等变量的引用,它保存对象本身的引用。

答案 1 :(得分:-1)

首先,当您创建对象joe时,只有一个对象引用:

Person joe = new Person("Joe", "Armstrong", 65);

然后将其添加到列表中,创建对同一对象的新引用:

persons.add(joe);

现在有2个引用,一个是joe,另一个是在集合persons内维护的。现在,在最后一步中,您可以更改参考:

joe = new Person("Joe", "Jonas", 35);

现在您已经创建了一个新对象,并带有一个新的引用。现在有2个引用和2个单独的对象:一个是引用第二个对象的joe,另一个是在引用原始joe对象的集合内维护。