【问题标题】:Add an object to an ArrayList and modify it later将对象添加到 ArrayList 并稍后修改
【发布时间】:2011-10-28 04:13:12
【问题描述】:

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

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

【问题讨论】:

  • 这个问题(&答案)真的值得收藏!
  • 只是我要问的所有问题:)

标签: java arraylist


【解决方案1】:

这种变化会反映在 ArrayList 中吗?

是的,因为您向列表中的对象添加了 reference。您添加的引用仍将指向同一个对象(您已修改)。


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

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


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

不,因为原始参考的内容在添加到列表时被复制。 (请记住,被复制的是 reference,而不是对象。)

演示:

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]

【讨论】:

  • 这个怎么样:按钮 a = 新按钮;按钮 b = 新按钮;按钮电流 = a;列表.添加(当前);当前 = b;如果我打印列表内容,它将是“a”还是“b”?
  • @aioobe 您的回答似乎与您帖子中声明复制对象引用的第一点(在本例中为“当前”)相冲突,然后将其从 a 更改为湾。我原以为它会打印 b。你能详细说明一下吗?
  • 请记住,Java 始终是pass by value(特别是对对象的引用是按值传递的),这一切都应该清楚。
  • 添加String 然后更改它似乎不是这种情况。即String a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
  • 我认为您可能想澄清pass by value 的含义,因为这似乎暗示您发送的内容无法更改,因为值已发送,而不是对某些内容的引用跨度>
【解决方案2】:

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

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

【讨论】:

  • 这是一个非常重要的区别
【解决方案3】:

谢谢大家。看了你的帖子我又想通了。这可能是一个令人困惑的概念,因为我早就消化了它,但最近我又忘记了它是如何工作的。所以我想分享为我解决问题的关键。 (请注意,Java 中的非原始对象(原始对象是 int、boolean 等)在技术上是指针)。当您将 object 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)

希望对某人有所帮助

【讨论】:

    【解决方案4】:

    想要添加另一个演示,其中 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]
    

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 2017-12-12
      • 2016-01-05
      • 2020-04-22
      • 2018-02-26
      相关资源
      最近更新 更多