其中哪一个在Java中运行更快?假设我想多次使用arraylist,但具有不同的值,因此最好使用clear()方法或将arraylist设置为null ??
1)实际上,您要比较的不是
temp=null; versus temp.clear();
但是
temp=new ArrayList<>(); versus temp.clear();
或说不同的说法:我们应该创建一个新的ArrayList
或通过调用clear()
?
查看此代码,该代码不会回收旧的ArrayList
实例:
for(int i=0;i<2000;i++)
{
temp=new ArrayList<Integer>();
for(int j=0;j<2000;j++)
{
temp.add(j);
}
ret.add((ArrayList<Integer>)temp.clone());
temp=null;
}
temp=null
是外部for
语句的最后一个语句,在此for
的每次迭代开始时,temp
变量先前引用的ArrayList
对象被丢弃为新的ArrayList
并分配给。
因此,将其分配给null
是如此无用。
2)您的测试有偏见。
回收ArrayList
实例可提供更好的结果,因为您的用例适合。
ArrayList
备份到数组。
在外循环的第一次迭代中,内部循环的迭代使后排阵列生长多次。
因此,在外循环的下一次迭代中,它利用了后面的数组具有目标尺寸。
因此不需要后背阵列的生长。
例如,如果您更改了在每次迭代中重新创建ArrayList
的新实例的代码版本,以用2000
作为参数调用构造函数public ArrayList(int initialCapacity)
,则应改善实际的最慢版本。
,为了知道这一点,我使用不同的方法清除数组两次。首先,我使用了清晰的方法
`class Check
{
public static void main (String[] args) throws java.lang.Exception
{
ArrayList<ArrayList<Integer>> ret=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> temp=new ArrayList<Integer>(2000);
for(int i=0;i<2000;i++)
{
for(int j=0;j<2000;j++)
{
temp.add(j);
}
ret.add((ArrayList<Integer>)temp.clone());
temp.clear();
}
}
}
`
我得到了以下统计信息:运行时:1.87S内存:4386816KB
另一方面,当我使用以下代码运行NULL方法时。` class Check
{
public static void main (String[] args) throws java.lang.Exception
{
ArrayList<ArrayList<Integer>> ret=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> temp;
for(int i=0;i<2000;i++)
{
temp=new ArrayList<Integer>(2000);
for(int j=0;j<2000;j++)
{
temp.add(j);
}
ret.add((ArrayList<Integer>)temp.clone());
}
}
}
`我的统计数据是运行时:0.19S内存:4386816KB
因此,很明显," clear()"工作速度比" null"方法慢,尽管它们使用的内存相同。