ArrayList.clear()vs ArrayList = null

时间:2017-09-19 20:21:33

标签: java performance arraylist

其中哪些在java中运行得更快? 假设我想多次使用ArrayList但是使用不同的值,那么使用clear()方法或将arraylist设置为null更好吗?

2 个答案:

答案 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;方法,虽然两者使用的内存相同。