繁体   English   中英

填充ArrayList与LinkedList

[英]Filling ArrayList vs LinkedList

我一直在想LinkedList填充速度比ArrayList快。 据我所知, ArrayList是基于长度有限(常数)的简单数组。 因此,每次阵列超出范围时,将创建具有更大范围的新阵列。 LinkedList更简单。 它没有任何限制(内存除外),因此应该更快地填充它。 但是我运行下一个代码:

 public static void main(String[] args) {
        int length = 7000000;

        List<Integer> list = new LinkedList<Integer>();
        long oldTime = System.currentTimeMillis();
        for (int i = 0; i < length; i++) {
            list.add(i);
        }
        System.out.println("LinkedList fill: " + (System.currentTimeMillis() - oldTime));

        list = new ArrayList<Integer>();
        oldTime = System.currentTimeMillis();
        for (int i = 0; i < length; i++) {
            list.add(i);
        }
        System.out.println("ArrayList fill: " + (System.currentTimeMillis() - oldTime));
    }

输出为:

LinkedList fill: 3936
ArrayList fill: 628

为什么这样?

您不能真正像Java那样对性能进行基准测试。 请参阅如何在Java中编写正确的微基准测试? 有关可能出问题的许多事情的更详细说明。

如果我使用jmh 测试您的代码则会得到以下结果:

Benchmark                      Mode  Samples  Score   Error  Units
c.a.p.SO26404256.arrayList     avgt        5  7.661 ± 0.672  ms/op
c.a.p.SO26404256.linkedList    avgt        5  9.675 ± 1.213  ms/op

因此,填充LinkedList似乎比填充arrayList稍慢,但是区别远小于您的测试所示。

至于差异的原因,可能是因为LinkedList的每个元素都包装在Node :这意味着更多的对象创建和更多的垃圾回收。 而且由于ArrayList中的数组副本而导致的损失可能比您想象的要少,因为它们已经过高度优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM