2 apple4661323 apple4661323 于 2014.12.18 10:31 提问

ArrayList 元素删除问题

初始化:
this.attribute = new ArrayList(Arrays.asList(temp.split(" ")));
this.cat_attr = new ArrayList(Arrays.asList(temp.split(" ")));
发现
cat_attr.remove(s);
时,attribute 里面的s元素也会自动删除,这是为什么啊。

5个回答

lxq_xsyu
lxq_xsyu   Rxr 2014.12.18 10:35

这两个持有的是同一个数组的首地址引用,操作的同一个数组。

bdmh
bdmh   Ds   Rxr 2014.12.18 10:38

恩,两个list中都是Arrays.asList对象,所以操作谁,都会影响另一个
如果每个Arrays.asList也是new出来的,就没事

apple4661323
apple4661323 其实我换了其他的初始化方法,也试过用索引进行删除,但是attribute里面的元素还是会跟着被移除。没办法我就每次移除cat_attr里面元素的时候,就把attribute再初始化一遍。
3 年多之前 回复
q107770540
q107770540   Ds   Rxr 2014.12.18 10:44

你要明白 值类型和引用类型的区别

这个你需要自己学习一下二者的区别,你就明白原因了

lxq_xsyu
lxq_xsyu   Rxr 2014.12.18 11:19

我刚试了一下,没有删除啊?

    public static void test(){
        String str = "a b c d e f g";
        List<String> temp = Arrays.asList(str.split(" "));
        ArrayList<String> alist1 = new ArrayList<String>(temp);
        ArrayList<String> alist2 = new ArrayList<String>(temp);
        alist1.remove("g");
        for(int i=0; i<alist2.size(); i++){
            System.out.println(alist2.get(i));
        }
    }
apple4661323
apple4661323 我自己这样测试也不会同时删除,但是一跑程序就会删除,没办法我就每次移除cat_attr里面元素的时候,就把attribute再初始化一遍。
3 年多之前 回复
lxq_xsyu
lxq_xsyu   Rxr 2014.12.18 11:23

看看源码就知道了,new ArrayList的时候会拷贝一份的,所以不会影响

     public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!