其中哪些在java中运行得更快? 假设我想多次使用ArrayList但是使用不同的值,那么使用clear()方法或将arraylist设置为null更好吗?
答案 0 :(得分:2)
1)事实上,你想要比较的不是
temp=null; versus temp.clear();
但是
temp=new ArrayList<>(); versus temp.clear();
或者换句话说:我们应该通过调用ArrayList
来创建新的clear()
还是回收旧的?{/ p>
查看不回收旧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
的每次迭代开始时,ArrayList
对象先前由{{1}引用当创建新的temp
并将其分配给时,将丢弃变量
因此将其分配给ArrayList
是没用的。
2)你的考试有偏见
回收null
实例可以获得更好的结果,因为您有一个适合的用例。
ArrayList
支持数组
在外循环的第一次迭代中,内循环的迭代使得后备数组增长多次
因此,在外循环的下一次迭代中,它有利于支持的数组具有目标大小
因此不需要支持阵列的增长。
例如,如果更改在每次迭代时重新创建ArrayList
的新实例的代码版本,以调用ArrayList
作为参数的构造函数public ArrayList(int initialCapacity)
,则应该改进实际最慢的版本。
答案 1 :(得分:1)
所以要知道这一点,我使用不同的方法运行此代码两次以清除数组。 首先,我使用了清晰的方法
`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.87秒内存: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
很明显&#34; clear()&#34;工作慢于&#34; null&#34;方法,虽然两者使用的内存相同。