如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList?
如果将对此对象的引用更改为null怎么办?这是否意味着ArrayList中的对象现在也为空?
Answers:
此更改将反映在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]
String
然后更改它似乎不是这种情况。即String a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
pass by value
因为这似乎意味着您发送的内容无法更改,因为发送了值,而不是对某些内容的引用
对对象的任何更改都将反映在列表中。
但是,当您处理不可变的字符串之类的对象时,将在“更改操作”上创建一个新对象。实际上,在其他位置有新对象时,旧对象仍在列表中。
谢谢大家。我通过阅读您的帖子再次弄清楚了。这可能是一个令人困惑的概念,因为我很早以前就已经消化过它,但是最近我忘记了它又如何工作。所以我想分享为我解决问题的钥匙。(请注意,Java中的非原始对象(原始是int,boolean等)在技术上都是指针)。当您将对象o添加到列表中时,列表和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)
希望它可以帮助某人
想要添加另一个演示,其中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]