Java ArrayList.clear()vs ArrayList=null
以下哪项在java中运行得更快?Java ArrayList.clear()vs ArrayList=null,java,performance,arraylist,Java,Performance,Arraylist,以下哪项在java中运行得更快? 假设我想多次使用ArrayList,但使用不同的值,那么使用clear()方法还是将ArrayList设置为null更好呢???为了了解这一点,我使用不同的方法来清除数组,运行了这段代码两次。 首先,我使用了清晰的方法 `class Check { public static void main (String[] args) throws java.lang.Exception { Ar
假设我想多次使用ArrayList,但使用不同的值,那么使用clear()方法还是将ArrayList设置为null更好呢???为了了解这一点,我使用不同的方法来清除数组,运行了这段代码两次。 首先,我使用了清晰的方法
`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();
}
}
}
`类检查
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
ArrayList ret=新的ArrayList();
ArrayList temp=新ArrayList(2000年);
对于(inti=0;i1),实际上,您想要比较的不是
temp=null; versus temp.clear();
但是
temp=null
是外部for
语句的最后一条语句,在每次迭代for
时,先前由temp
变量引用的ArrayList
对象将被丢弃,因为新的ArrayList
将被创建并分配给它。
因此,将其分配给null
是毫无用处的。
2) 你的测试有偏差。
回收ArrayList
实例可以获得更好的结果,因为您有一个适合的用例。
ArrayList
备份到数组。
在外循环的第一次迭代中,内循环的迭代会使备份数组成倍增长。
因此,在外循环的下一次迭代中,它利用了备份阵列具有目标大小的优势。
因此,不需要增加备份阵列。
例如,如果更改代码版本,在每次迭代中重新创建ArrayList
的新实例,以调用构造函数public ArrayList(int initialCapacity)
使用2000
作为参数,它应该会改进实际最慢的版本。null
不是一个方法,并且您没有对数组列表对象做任何操作。您只是比使用其他方法稍早地丢弃对它的引用。当您重新进入循环并为变量分配新数组列表时,您还丢弃了旧的引用。也看到我对它进行了处理,消除了偏差,得到了相反的、令人震惊的结果。的确,差异是令人印象深刻的。请注意,在您的示例中,清除ArrayList
会迭代2000个元素2000次。这很重要。因此,通过指定ArrayList的目标大小并避免若要迭代清除,此版本可能会更快。但在分配新数组时,垃圾收集器也必须清除以前的内存。现在不一定。事实上,只要对象不再被引用,GC就不会立即进行收集。这可能会发生,但仅当堆消耗接近其最大大小时才会发生。由于对象不再被引用,我们说它有资格被收集。它可能需要几毫秒或几秒钟。而clear()
实现会迭代所有元素以将它们设置为null:for(int i=0;i
temp=null; versus temp.clear();
temp=new ArrayList<>(); versus temp.clear();
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;
}