Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList.clear()vs ArrayList=null_Java_Performance_Arraylist - Fatal编程技术网

Java ArrayList.clear()vs ArrayList=null

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

以下哪项在java中运行得更快?
假设我想多次使用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;
    }