- 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
不晓得对不对.