当前位置: 代码迷 >> J2EE >> 关于=null和clear(),该怎么处理
  详细解决方案

关于=null和clear(),该怎么处理

热度:62   发布时间:2016-04-22 01:55:06.0
关于=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
不晓得对不对.
  相关解决方案