将对象添加到ArrayList并稍后进行修改

时间:2011-08-16 15:12:48

标签: java arraylist

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

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

4 个答案:

答案 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]
相关问题