问题:
ArrayList<Double> tp = new ArrayList<>();
ArrayList<ArrayList<Double>> tps = new ArrayList<ArrayList<Double>>();
while ((string = bReader.readLine()) != null){
String[] strings = string.split(",");
for(String s:strings){
tp.add(Double.parseDouble(s)); //1
}
System.out.println("第"+i+"行:");
System.out.println(tp);
System.out.println();
tps.add(tp); //2
tp.clear(); //3
}
上面1,2,3行代码中使用了ArrayList类的clear方法,当第3行clear时,变量tps中已经add的tp的值也会被clear掉!并且,下次while循环时,tps加载tp两次,clear之后又被清除掉,依次循环,最终tps中都为null值。
解决:
当使用clear()方法也消耗很长的时间时,考虑创建一个新的列表,因为java可以很快的创建一个新的对象;
在列表长度很小的情况下(eg:10或100个元素),可以放心的使用这两种方法clear或removeAll。但如果列表很大(eg:10M个元素),那么选择clear还是removeAll会对你java应用的性能造成巨大的影响。甚至有时,在列表过大的情况下,重置会耗费许多时间,那么重新创建一个新的列表比将老的列表重置要好。但需要提醒的是,必须要确保老的列表可以被垃圾回收。
关于回收:
如果这个对象没有被 任何人 引用 它 ,就会被回收