为什么List 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]
为啥是浅拷贝?求解答!
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,更说明是深拷贝啊
浅拷贝所指向的地址相同,会受到另一个对象的影响。
深拷贝,两个对象指向不同的地址,其中一个对象改变,不会影响另一个对象。
list1对象并没有受到list对象的影响,这是深拷贝。
https://www.cnblogs.com/luxd/p/11933686.htm