listCount.add(list1); 这个是将list1所指向的对象添加到listCount而不是list1本身,所以后面对list1重新赋值,不会影响到已经添加到listCount里面的对象。
list1 = new ArrayList();
list1.add("2");
这个时候list1是指向了新的对象并且里面有元素“2”,但这个时候listCount里面仍然是有之前添加的ArrayList(里面有一个元素“1”),所以之后再添加一个新的ArrayList(里面有一个元素“2”),添加后listCount里面自然有两个ArrayList类型的对象,且两个list里面分别有一个String类型的对象“1”和“2”。
补充:List list1 = new ArrayList(); 这里有两个对象产生,list1(在栈里面)和其指向的new出来的对象(在堆里面),add添加的是堆里面那个实际的对象,重新对list1赋值只是切断了其与第一个new出来的堆里面的对象的关系,不会影响到listCount,但是如果不是重新赋值,而是改变那个对象的属性,那listCount里面就相应的变了
List listCount = new ArrayList();
//listCount集合一直存在
List list1 = new ArrayList();
list1.add("1");
//加入第一个
listCount.add(list1);
//1,代码运行到了这里,listCount里面的值是[[1]]
//2,list1又指向了一个新的
list1 = new ArrayList();
//加入第二个
list1.add("2");
listCount.add(list1);
System.out.println(listCount.size());
//listCount从来就没改变过,一直在内存中,所以大小是2啊
重回答吧
list1只是对象的一个引用,第一次listCount.add(list1);表示把这个引用指向的对象加入listCount,关键是这时候不是加入的list1,是它指向的对象
第二次list1 = new ArrayList();其实只是把list重新指向新的ArrayList了,先加入listCount的对象是没任何变化的
纠正,//3 这里的值应该是[[1, 2], [1, 2]]
所以你的理解没错,“list1的指向的地址变了,所以listCount里面的值也应该发生变化了”
但是listCount是增加了2个list1的
----------------针对问题补充。
java中传递的是值,不是引用。 这个要牢记。
listCount.add()添加的是对象,虽然你的list1指向了新的ArrayList()但是listCount.get(0)仍然指向原来的对象,你再次添加list1,对listCount来说又是一个新的对象了,所以是[[1][2]]