将对象添加到ArrayList并在以后修改


79

如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList?

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


1
这个问题(和答案)确实值得收藏!
特里

我只想问的所有问题:)
navid

Answers:


83

此更改将反映在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]

那怎么办:Button a = new Button;按钮b =新按钮;按钮电流= a; List.add(当前); 当前= b; 如果我打印列表内容,它将是“ a”还是“ b”?
洛伦佐·斯奎托

1
@aioobe您的答案似乎与帖子中的第一点冲突,在该位置您声明复制了对对象的引用(在本例中为“当前”),然后将其从a更改为b。我希望它能打印b。你能详细说明吗?
2013年

2
请记住,Java总是按值传递(特别是对对象的引用按值传递),并且应该都清楚。
aioobe

添加aString然后更改它似乎不是这种情况。即String a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
Don Cheadle

我认为您可能需要澄清含义,pass by value因为这似乎意味着您发送的内容无法更改,因为发送了值,而不是对某些内容的引用
Don Cheadle

5

对对象的任何更改都将反映在列表中。

但是,当您处理不可变的字符串之类的对象时,将在“更改操作”上创建一个新对象。实际上,在其他位置有新对象时,旧对象仍在列表中。


这是一个非常重要的区别
Don Cheadle 2015年

1

谢谢大家。我通过阅读您的帖子再次弄清楚了。这可能是一个令人困惑的概念,因为我很早以前就已经消化过它,但是最近我忘记了它又如何工作。所以我想分享为我解决问题的钥匙。(请注意,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)

希望它可以帮助某人


-1

想要添加另一个演示,其中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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.