问题来的来源
new ArrayList()创建了一个新的地址 底层用了copyof 是深拷贝,能输出正确答案。
不新建一个集合 来 赋值 subset的话 会发生引用传递 最后的subset可能是[],所以前面的元素也会变成[] (原因在图一,add的一值是同一个subset的地址,subset改变,result的所有元素跟着改变)。
自己的一个举例,开拓自己的思想,有自己的注释。
package com.itheima.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public Test() {
}
public Test(List<Integer> arrayList) {
this.arrayList = arrayList; //这里面是赋值 subset赋值给arrayList 是复制地址 浅拷贝 没有创建新的地址。
//所以是test里面的属性的arrayList指向subset的地址,test指向的是Test类对象的地址,和subset没有关系。
//subset指向的是 原来的ArrayList的地址 subset2 是new出来的新地址 所以是深拷贝 有参的引用类型是Collectino父接口
//底层是copyof public ArrayList(Collection<? extends E> c) elementData = Arrays.copyOf(elementData, size, Object[].class);
}
public static void main(String[] args) {
List<Integer> subset = new ArrayList<>(); //独立的集合
subset.add(1);//[1]
List<Integer> subset2 =new ArrayList<>(subset); //里面是拷贝subset的值数据到集合subset2中
Test test = new Test(subset); //类对象,里面由一个集合成员,将subset的内存地址赋值给里面的集合
System.out.println(test);
}
private List<Integer> arrayList;
/**
* 获取
* @return arrayList
*/
public List<Integer> getArrayList() {
return arrayList;
}
/**
* 设置
* @param arrayList
*/
public void setArrayList(List<Integer> arrayList) {
this.arrayList = arrayList;
}
public String toString() {
return "Test{arrayList = " + arrayList + "}";
}
}