List.clear
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
ArrayList<Object> list2 = new ArrayList<>();
list2.add("2");
for (int i = 0; i < 4; i++) {
list2.clear();
list2.add(i);
System.out.println(list2);
list.add(list2);
}
System.out.println(list2);//[4]
System.out.println(list); //[[4],[4],[4],[4]]
other:
list2.add("2");
list.add(list2);
list2.clear();
list2.add("3");
list.add(list2);
System.out.println(list2);//[3]
System.out.println(list);//[[3],[3]]
方法也是疑惑:
ArrayList<Object> list = new ArrayList<>();
ArrayList<Object> list2 = new ArrayList<>();
list2.add("2");
list.add(list2);
list2=null; //这里赋值null时,为什么list中的值不时null还是2呢?是java自身做了什么吗?
list2 = new ArrayList<>();
list2.add("3");
list.add(list2);
System.out.println(list2);
System.out.println(list);
//结论:
//clear只是单纯的清空list中每个值赋值null,并且将list大小重新设为0;并不会改变null值。
//如果要进行list2值的修改并且每次修改时都清空或者说隔一段时间进行清空,
// 并且又在list中进行对list2的添加时,不能使用clear,除非你想list添加的值都是最新的集合值(即要用一个list去保存另一个list2过去所有值时,不使用clear)
//直接复制null然后在重新new一个list2即可。 list2= new ArrayList; 复制null是为了方便gc。
}
疑惑解答:
list2是根据new时的地址进行赋值,当赋值null时,跟这个地址就失去了关联,gc时会被清理掉。
而list添加list2时也是添加地址,地址的值并不是空,因此list不受影响
list.removeAll(list2):移除list在list2中包含的元素(移除交集)retainAll刚好相反。