为什么List list1 = new ArrayList<>(list) 是浅拷贝?

为什么List<String> list1 = new ArrayList<>(list) 是浅拷贝?

问题描述:

@Test
public void test(){
  List<String> list = new ArrayList<>();
  list.add("abc");
  list.add("bcd");
  List<String> list1 = new ArrayList<>(list);
  list.remove("abc");
  System.out.println(list);
  System.out.println(list1);
}

打印结果:
[bcd]
[abc,bcd]
为啥是浅拷贝?求解答!

https://blog.****.net/DeMonliuhui/article/details/54572908

List<String> list = new ArrayList<>();
new出来的ArrayList对象放在了堆内存中,list引用指向了堆内存的地址,ArrayList中存放的是String字符串地址,String字符串是放在常量池中的。
List<String> list2 = new ArrayList<>(list);
这里复制的是地址,list2存放的地址与list中存放的地址是同一个,所以是浅拷贝。

另外针对题主的疑问:题主可能有误解,博主描述的深浅拷贝是针对list中存放的内容而言的,不是针对new的两个list对象,这两个list对象都是使用new创建的,地址肯定是不一样的。你理清楚这个就能看懂这个博主的文章了

你写的这个是深拷贝呀!
明显地址不一样呀,


    public static void test(){
        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bcd");
//        这是浅拷贝
        List<String>list1=list;
        list1.remove("bcd");
        System.out.println(list==list1);
        System.out.println(list);
        System.out.println(list1);
//        这是深拷贝
        List<String> list2 = new ArrayList<>(list);
        System.out.println(list==list2);
       list2.remove("bcd");
        System.out.println(list2);

题主,我觉得这文章里面说的没错,人家也给出例子来了,例子里面用的是引用类型,浅拷贝意思是说复制出来的list里面的元素和原来的list里面的元素指向了同一个对象。这样的后果就是如果改变了list1里面元素内部的值,比如person.name改成张三,那么复制出来的list2里面对应的那个元素的name属性值就也变成张三了。你自己测试用的是不可变的String所以没法测试这个浅拷贝的效果

这 怎么是浅拷贝啦?list删除abc,list1没有删除abc,更说明是深拷贝啊