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

Java 将对象添加到ArrayList并在以后进行修改,java,arraylist,Java,Arraylist,如果我有一个ArrayList,我向其中添加了一个对象,然后我修改了这个对象,这个更改会反映在ArrayList中吗?或者当我将对象添加到ArrayList时,Java会创建一个副本并将其添加到ArrayList 如果我将对该对象的引用更改为null会怎么样?这是否意味着ArrayList中的对象现在也为空 此更改是否会反映在ArrayList中? 是,因为您在列表中添加了对对象的引用。添加的参照仍将指向同一对象(已修改) 或者当我将对象添加到ArrayList时,Java会创建一个副本并将其

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

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

此更改是否会反映在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]
StringBuffer sb=新的StringBuffer(“foo”);
列表=新的ArrayList();
添加(sb);
System.out.println(列表);//印刷品[foo]
某人附加(“律师”);
System.out.println(列表);//印刷品[foobar]
sb=null;
System.out.println(列表);//仍在打印[foobar]

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


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

希望添加另一个演示,其中ArrayList作为值位于贴图内部。ArrayList在添加到地图后会被修改,地图会反映更改

映射有一个元素,其中母亲的名字作为键,子元素作为值

    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]
String key=“adeleMom”;
Map myMap=newhashmap();
ArrayList firstList=新的ArrayList();
第一列表。添加(“adele”);
myMap.put(key,firstList);
firstList=null;
arraylistsecondlist=myMap.get(key);
System.out.println(第二个列表);//印刷品[阿黛尔]
第二个列表。添加(“邦妮”);
System.out.println(“添加的bonnie”);
arraylistthirdlist=myMap.get(key);
System.out.println(第三名);//版画[阿黛尔,邦妮]

谢谢大家。我看了你的帖子又明白了。这可能是一个令人困惑的概念,因为我很久以前就已经消化了它,但最近我又忘记了它是如何工作的。所以我想分享解决问题的钥匙。(请注意,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


希望它能帮助别人

这个怎么样:按钮a=新按钮;按钮b=新按钮;按钮电流=a;列表。添加(当前);电流=b;如果我打印列表内容,它将是“a”或“b”?@aioobe您的答案似乎与您文章中的第一点冲突,您在该点中声明对对象的引用被复制(在本例中为“当前”),然后从a更改为b。我本以为它会打印b。您能详细说明一下吗?请记住,Java总是(特别是对对象的引用是通过值传递的)并且应该很清楚。添加
字符串
然后更改它似乎不是这样的。i、 e.
String a=“first”;列表.添加(a);a=“第二”。。。打印(list.get(0))/“first”
我想你可能想澄清
传递值的含义,因为这似乎意味着你发送的内容无法更改,因为该值已发送,而不是对某些内容的引用该问题(和答案)确实值得一个书签!我想问的所有问题:)这是一个非常重要的区别
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)