2 cmf191734907 cmf191734907 于 2016.03.31 11:19 提问

集合中关于addAll的一些问题

集合a,b, a.addAll(b),a中添加的是b中元素的地址还是具体的元素,我理解是存的地址,那为什么修改a或b中的元素,不会影响另一个

6个回答

u010165147
u010165147   2016.03.31 12:55
已采纳
ArrayList<Object> array=new ArrayList<Object>();
    String[] ss={"a","b","c"};
    array.add(ss);
    ArrayList<Object> array2=new ArrayList<Object>();
    array2.addAll(array);
    ((String[])array2.get(0))[0]="d";
    Assert.assertEquals(((String[])array2.get(0))[0],((String[])array.get(0))[0]);//sucess


    ArrayList<Object> array=new ArrayList<Object>();
    array.add("ss");
    ArrayList<Object> array2=new ArrayList<Object>();
    array2.addAll(array);
    array2.set(0, "sd");
    Assert.assertEquals(array2.get(0),array.get(0));//failed
cmf191734907
cmf191734907 谢谢大神,对我很有帮助
一年多之前 回复
cmf191734907
cmf191734907   2016.03.31 11:23

数组转换成集合,为什么集合元素的改变会影响数组

magoo_up
magoo_up   2016.03.31 11:33

首先集合是一个泛概念,你用的是那种集合?ArrayList?HashSet?
我可以确定的时修改a或b中的元素会影响另一个

贴出你的代码

cmf191734907
cmf191734907 collection.get(i).xxx 这个xxx是什么,培训刚学到集合,问题比较多,也没讲过这个
一年多之前 回复
magoo_up
magoo_up 回复cmf191734907: 另外一定要注意,使用Arrays.asList转换后的List是java.util.Arrays.ArrayList而不是java.util.ArrayList,切不可直接转换。
一年多之前 回复
magoo_up
magoo_up 回复cmf191734907: ArrayList的内部原理是其内部有一个数组成员负责存储元素,数组转List后把外部组的引用直接赋值给List内部的数组成员。所以对list的任何修改都等同于对原来外部数组的修改。具体你看一下转换过程的源码。
一年多之前 回复
cmf191734907
cmf191734907 喔喔,是这样啊,理解了,那为什么数组转换为集合,集合set修改会影响数组呢
一年多之前 回复
magoo_up
magoo_up 回复cmf191734907: 要“修改a或b中的元素”是用collection.get(i).xxx=x或collection.get(i).setXXX(x),这样是修改,相对另一个集合中的同一个元素自然也是更新的。
一年多之前 回复
magoo_up
magoo_up 回复cmf191734907:看来你用的是List。set修改的是集合,是把原来位子上的旧元素丢弃,放入一个新元素,并没有对旧元素修改。并不是“修改a或b中的元素”而是“修改了a或b",自然不会对另一个集合产生影响。理解一下
一年多之前 回复
cmf191734907
cmf191734907 set不是修改吗,在原来位子上加入了一个,那会为什么不影响另一个集合
一年多之前 回复
cmf191734907
cmf191734907 在b中有"aaa","bbb",我用set方法修改b中的元素,a中怎么没变
一年多之前 回复
magoo_up
magoo_up 我为什么如此确定呢,修改元素不是用collection.set(i, newVal),这不是修改,这是在原来位置放入一个新元素。修改时collection.get(index),能在此基础上修改的都是正常的Object对象,而非String等赋值类型。
一年多之前 回复
CSDNXIAON
CSDNXIAON   2016.03.31 11:34

List集合以及add() 与addAll()的区别
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

bdmh
bdmh   Ds   Rxr 2016.03.31 11:34

看你添加的是什么类型,如果是值类型,不影响,如果是引用类型,影响

yiliang121816976
yiliang121816976   2016.03.31 11:36

建议去看一下该方法的源码!我已不记得了,但是对于这个方法,我的理解是遍历b集合,复制b集合中的每个元素,并添加到a集合中去!所以存的并不是b集合的索引~

cmf191734907
cmf191734907 好的,谢谢
一年多之前 回复
yiliang121816976
yiliang121816976 另外b集合中的元素也可以分为基本类型的数据和引用类型的数据。前者应该不变的,后者不是很清楚,可以测试一下或者看一下源码
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!