如果我有一个ArrayList,并且我添加了一个对象,后来我修改了这个对象,这个更改是否会反映在ArrayList中?或者当我将对象添加到ArrayList时,Java会创建一个副本并将其添加到ArrayList?
如果我将对此对象的引用更改为null,该怎么办?这是否意味着ArrayList中的对象现在也为空?
答案 0 :(得分:71)
此更改会反映在ArrayList中吗?
是的,因为您在列表中的对象中添加了引用。您添加的引用仍将指向同一个对象(您修改过的)。
或者当我将对象添加到ArrayList时,Java会创建一个副本并将其添加到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]
答案 1 :(得分:4)
对象的任何更改都将反映在列表中。
但是,当您处理不可变的字符串之类的对象时,将在“更改操作”上创建一个新对象。实际上,当你在其他地方有一个新对象时,你的旧对象仍在列表中。
答案 2 :(得分:0)
谢谢大家。我通过阅读您的帖子再次弄清楚了。这可能是一个令人困惑的概念,因为我很早以前就已对其进行了消化,但是最近我忘记了它又如何工作。所以我想分享为我解决问题的钥匙。 (请注意,Java中的非原始对象(原始是int,boolean等)在技术上都是指针)。当您将 o对象添加到列表中时,该列表和 o 指向相同的事物,因此当您修改 o 时,列表的项会更改。只要它们指向同一事物,并且当o用 = 指向其他事物时中断它们。
o = null; //o points to nothing and changes in o from now on doesn't effect the list's item
或
Object a = new Object();
o = a; //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)
希望它对某人有帮助
答案 3 :(得分:-1)
想要添加另一个演示,其中ArrayList在Map中作为值。添加到Map后,ArrayList会被修改,而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]