将一个对象添加到ArrayList中,稍后再进行修改

如果我有一个ArrayList,并且我添加了一个对象,并且稍后我修改了这个对象,这个改变会反映在ArrayList中吗? 或者当我将对象添加到ArrayList时,Java创build一个副本并将其添加到ArrayList?

如果我将该对象的引用更改为null,该怎么办? 这是否意味着ArrayList中的对象现在也是空的?

这个改变会反映在ArrayList中吗?

是的,因为你添加了列表中的对象的引用 。 你添加的引用仍然会指向同一个对象,(你修改的)。

或者当我将对象添加到ArrayList时,Java创build一个副本并将其添加到ArrayList?

不,它不会复制对象。 (它会复制对象的引用。)

如果我将该对象的引用更改为null,该怎么办? 这是否意味着ArrayList中的对象现在也是空的?

不,因为原始引用的内容被添加到列表中时被复制 。 (请记住,它是复制的引用 ,而不是对象。)

示范:

StringBuffer sb = new StringBuffer("foo"); List<StringBuffer> list = new ArrayList<StringBuffer>(); list.add(sb); System.out.println(list); // prints [foo] sb.append("bar"); System.out.println(list); // prints [foobar] sb = null; System.out.println(list); // still prints [foobar] 

对象的任何改变都会反映在列表中。

但是,当处理像不可变的string这样的对象时,将在“更改操作”上创build一个新对象。 实际上,当您在其他地方find新的对象时,您的旧对象仍然在列表中。

想要添加另一个演示,其中ArrayList是一个Map中的值。 ArrayList在添加到Map之后被修改,并且Map反映更改。

该地图有一个元素,母亲的名字为钥匙,孩子为价值。

  String key = "adeleMom"; Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>(); ArrayList<String> firstList = new ArrayList<String>(); firstList.add("adele"); myMap.put(key, firstList); firstList = null; ArrayList secondList = myMap.get(key); System.out.println(secondList); // prints [adele] secondList.add("bonnie"); System.out.println("Added bonnie"); ArrayList thirdList = myMap.get(key); System.out.println(thirdList); // prints [adele, bonnie]