当前位置:编程学习 > JAVA >>

定义一个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> 属于坯型,会有编译器警告。 --------------------编程问答--------------------
引用 2 楼 soulx 的回复:
因为这是引用

我用System.out.println(all.get(0).toString());打印,出现[]是为什么? --------------------编程问答--------------------
引用 3 楼 raistlic 的回复:
因为你看错了,all不为空。

另外 ArrayList<ArrayList> 属于坯型,会有编译器警告。

我用System.out.println(all.get(0).toString());打印,出现[]是为什么?  --------------------编程问答-------------------- 因为all 只是添加了对于resultList1集合的一个引用,  真实的集合清空了,你在引用这个集合肯定就没有了。。 --------------------编程问答--------------------
引用 6 楼 ch656409110 的回复:
因为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(", ");
}
    }
--------------------编程问答--------------------
引用 8 楼 ch656409110 的回复:
不好意思,,我看错了:
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,你用循环里面的元素也出不来啊 --------------------编程问答-------------------- 一个大篮子里面放个小篮子,小篮子里面有东西,现在你把小篮子里面的东西拿走了,大篮子里面当然只剩小篮子了 --------------------编程问答--------------------
引用 8 楼 ch656409110 的回复:
不好意思,,我看错了:
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(", ");
}
    }

应该是引用的问题,因为在resultList1.clear()之前打印就有,之后打印就没有 --------------------编程问答-------------------- 那是因为arrayList1里面为空,你要是加个值或者干脆new它的时候重写toString  --------------------编程问答--------------------
引用 12 楼 ch656409110 的回复:
那是因为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();
}
};
--------------------编程问答--------------------
引用 7 楼 mjfaye 的回复:
Quote: 引用 6 楼 ch656409110 的回复:

因为all 只是添加了对于resultList1集合的一个引用,  真实的集合清空了,你在引用这个集合肯定就没有了。。

那需要删除resultList1,同时还要all里存在,应该怎么解决?

要用clone,如果你的List<E>中的类型是基本类型的包装类直接用浅克隆,如果是其他引用类型的必须要用深克隆实现。
深克隆与浅克隆请看http://blog.csdn.net/lifetragedy/article/details/9751079
java实现shallow clone(浅克隆)与深克隆(deep clone) --------------------编程问答-------------------- all.get(0)取到的是resultList1,resultList1元素已清空
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,