日期:2014-05-20  浏览次数:20673 次

关于=null和clear()
Java code

import java.util.ArrayList;
import java.util.List;


public class TestList {
private List<String> list;
private List<List<String>> mainList;
public TestList(){
    list = new ArrayList<String>();
    mainList = new ArrayList<List<String>>();
}
public static void main(String arg[]){
    String[] mylist = {"sunday","monda","tuesday","wednesday","thurday","friday","saturday"};

    TestList tl1 = new TestList();

    for(String s : mylist)
        tl1.list.add(s);//这里为什么可以这样写? list是私有变量 可以对象点么?不解
    
        tl1.mainList.add(tl1.list);
    //tl1.list.clear(); // here if clear then not getting the list
//    tl1.list = null; ///// but here to assign null still getting list
    tl1.list.clear();
    System.out.println("after clear");
    System.out.println("@@@@@@@@@======="+tl1.list);
    for(List<String> list : tl1.mainList){
        for(String s : list){
            System.out.println("*********"+s);
        }
    }
}
 }
=================================== clear 的时候结果为
after clear
@@@@@@@@@=======[]
===================================null 的时候结果为
after clear
@@@@@@@@@=======null
*********sunday
*********monda
*********tuesday
*********wednesday
*********thurday
*********friday
*********saturday





------解决方案--------------------
clear()只是清空list中所有的elements,list依然会占用内存空间
而=null则是释放掉list所占的内存空间
你注释中的问题:
list是私有变量没有错,但你没有注意你的main方法跟list是在同一个类吗?
------解决方案--------------------
tl1.list.add(s);//这里为什么可以这样写? list是私有变量 可以对象点么?不解
私有变量在自己的类里是可以的


//tl1.list.clear(); // 内存中的东西被清除了
// tl1.list = null;//只是tl1.list不在指向任何对象,内存中的东西还在
谨慎考虑,回答错误,概不负责




------解决方案--------------------
根据情况来看吧,ArrayList内部维护的是一个数组,那么你list == null;就是释放这个数组对象,当然里面所引用的对象也就释放了。如果list.clear();看看源代码就知道了,是把list里面对象遍历赋值为null,意思就是释放list里面所有对象。

这样就很清楚了,如果你这个list还需要使用,那么你可以使用clear去释放掉list里面所有的数据,GC在回收的时候就有可能回收掉原list里面的这些数据了。如果你都不需要了,那么你就用==null这样GC就有可能把list以及里面关联的一些数据也都回收了
------解决方案--------------------
clear清空list的元素
=null 是取消引用
我觉得clear是清楚内存(不是gc回收,里面没数据了也就不占内存空间了)而=null要等方法跑完gc才会回收这个list
不晓得对不对.