定义一个ArrayList<ArrayList> all = new ArrayList<ArrayList>();
定义一个ArrayList<ArrayList> all = new ArrayList<ArrayList>();ArrayList<String> resultList1 = new ArrayList<String>();
all.add(resultList1);
resultList1.clear();
为什么这个时候all 也为空了?
--------------------编程问答-------------------- --------------------编程问答-------------------- 因为这是引用 --------------------编程问答-------------------- 因为你看错了,all不为空。
另外 ArrayList<ArrayList> 属于坯型,会有编译器警告。 --------------------编程问答--------------------
我用System.out.println(all.get(0).toString());打印,出现[]是为什么? --------------------编程问答--------------------
我用System.out.println(all.get(0).toString());打印,出现[]是为什么? --------------------编程问答-------------------- 因为all 只是添加了对于resultList1集合的一个引用, 真实的集合清空了,你在引用这个集合肯定就没有了。。 --------------------编程问答--------------------
那需要删除resultList1,同时还要all里存在,应该怎么解决? --------------------编程问答-------------------- 不好意思,,我看错了:
resultList1.clear(); 清空的是resultList1。我看成是all集合了。
System.out.println(all.size()); 输出为1,说明all没有被清空。只是把resultList1清空了。。
至于 System.out.println(all.get(0).toString()); 输出为[] 可以理解为获取all集合的第一个arraylist元素,该元素集合中没有子元素,所以输出为[]。这是因为 ArrayList间接继承的类AbstractCollection 重写了toString()方法,如下:
--------------------编程问答--------------------
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
size是1,但是不光是toString,你用循环里面的元素也出不来啊 --------------------编程问答-------------------- 一个大篮子里面放个小篮子,小篮子里面有东西,现在你把小篮子里面的东西拿走了,大篮子里面当然只剩小篮子了 --------------------编程问答--------------------
应该是引用的问题,因为在resultList1.clear()之前打印就有,之后打印就没有 --------------------编程问答-------------------- 那是因为arrayList1里面为空,你要是加个值或者干脆new它的时候重写toString --------------------编程问答--------------------
arrayList1不为空,就是传进去的是引用,对象没了就都没了, --------------------编程问答-------------------- 什么意思呢?? 不能这么理解啊,传进去的arrayList1 这个引用不为空,只不过它里面没有元素罢了。。
比如:
--------------------编程问答--------------------
ArrayList<String> resultList1 = new ArrayList<String>(){
@Override
public String toString() {
if(this.size()==0){
System.out.println("元素为空");
}
return super.toString();
}
};
要用clone,如果你的List<E>中的类型是基本类型的包装类直接用浅克隆,如果是其他引用类型的必须要用深克隆实现。
深克隆与浅克隆请看http://blog.csdn.net/lifetragedy/article/details/9751079
java实现shallow clone(浅克隆)与深克隆(deep clone) --------------------编程问答-------------------- all.get(0)取到的是resultList1,resultList1元素已清空
补充:Java , Java SE