Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 vs LinkedList_Java_Arraylist_Linked List_Performance Testing_Microbenchmark - Fatal编程技术网

Java 填充ArrayList vs LinkedList

Java 填充ArrayList vs LinkedList,java,arraylist,linked-list,performance-testing,microbenchmark,Java,Arraylist,Linked List,Performance Testing,Microbenchmark,我一直认为LinkedList的填充速度比ArrayList快。据我所知,ArrayList基于长度有限的简单数组(常量)。所以每次数组超出范围时,都会创建范围更大的新数组链接列表要简单得多。它没有任何限制(除了内存),所以应该更快地填充。但我运行下一个代码: public static void main(String[] args) { int length = 7000000; List<Integer> list = new LinkedL

我一直认为
LinkedList
的填充速度比
ArrayList
快。据我所知,
ArrayList
基于长度有限的简单数组(常量)。所以每次数组超出范围时,都会创建范围更大的新数组<代码>链接列表要简单得多。它没有任何限制(除了内存),所以应该更快地填充。但我运行下一个代码:

 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));
    }

为什么会这样呢?

在Java中,您无法真正实现这样的性能基准测试。有关许多可能出错的事情的更详细解释,请参阅

如果我与我得到以下结果:

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的每个元素都包装在一个
节点中:这意味着更多的对象创建和更多的垃圾收集。而且由于ArrayList中的阵列副本而造成的损失可能比您想象的要小,因为它们经过了高度优化。

因为您的基准测试存在缺陷。你有试着交换吗?首先是arraylist,然后是linkedlist?如果反之亦然,即先是arraylist,然后是LL?同时将长度传递给ArrayList构造函数,看看会发生什么?没有任何变化。你可以在两个不同的程序中分别运行它们。请参阅相关链接。。
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