Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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 为什么在插入到LinkedList和ArrayList的时间上会得到不同的输出_Java_Arraylist_Linked List - Fatal编程技术网

Java 为什么在插入到LinkedList和ArrayList的时间上会得到不同的输出

Java 为什么在插入到LinkedList和ArrayList的时间上会得到不同的输出,java,arraylist,linked-list,Java,Arraylist,Linked List,我在使用LinkedList和ArrayList,我知道将元素添加到ArrayList和LinkedList中的概念,但我在运行检查插入时间的代码时得到了 对于LinkedList和ArrayList,一次又一次的不同插入时间 有时候LinkedList的插入时间会更好,反之亦然,到底是怎么发生的,有人能告诉我吗 import java.util.ArrayList; public class Time { public static void main(String args[

我在使用LinkedList和ArrayList,我知道将元素添加到ArrayList和LinkedList中的概念,但我在运行检查插入时间的代码时得到了 对于LinkedList和ArrayList,一次又一次的不同插入时间

有时候LinkedList的插入时间会更好,反之亦然,到底是怎么发生的,有人能告诉我吗

import java.util.ArrayList;

public class Time
   {

   public static void main(String args[])

    {

       int n=100000;
       long milis = System.currentTimeMillis();
       ArrayList obj=new ArrayList();

    for(int k=0;k<=n;k++)
    {
        obj.add(k);



    }
    System.out.println("insert arraylist takes "
            +(System.currentTimeMillis()-milis)+" ms");
}

  }
import java.util.ArrayList;
公共课时间
{
公共静态void main(字符串参数[])
{
int n=100000;
long milis=System.currentTimeMillis();
ArrayList obj=新的ArrayList();

对于(int k=0;k一般来说,链表在添加和删除列表末尾以外的任何位置的元素时会更有效,但在查找列表中的任意索引时会慢得多。要在任何位置添加或删除元素,
LinkedList
只需更改两个引用,但在
ArrayList
在查找任意索引时,
ArrayList
只需跳转到内存中的该位置,
LinkedList
必须遍历每个项直到该点

这是一个简单的例子。有两个主要原因让你看不到上面的内容:

  • 首先,微基准在最好的时候很糟糕,但特别是在像Java这样的语言中,JIT将“预热”并改变过程中的性能。要么在真实场景中对其进行基准测试,要么你几乎可以挥手告别任何真实的性能指标

  • 其次,
    ArrayList
    在过去的几年中进行了大量的优化,我甚至注意到它在某些情况下的性能更快,而在某些情况下,您通常会期望
    LinkedList
    获胜


就我个人而言,我会将
ArrayList
放在我正在使用的实际应用程序中,而不是一个微基准中,并测量性能。如果性能不可接受,我会将实现切换到
LinkedList
(这应该是一个单行更改)然后再次运行基准测试进行检查。如果没有这些检查,几乎不可能说在您的场景中什么性能会更好。

每次您开始对java进行基准测试时,您都必须对您的结果非常怀疑。大多数时候,您的结果会显示出您可以预期的不同结果。有太多的因素可能会影响测试结果影响程序的性能。要制作正确的基准测试,您需要深入了解JVM。我能为您指出的最简单的几点是:

  • JIT预热(您的第一次基准测试结果通常会比以后差得多)
  • DCE又名死代码删除。这不是你的情况,但了解它也很有用

为了使用能够正确解释结果的良好基准测试,我建议查看并仔细检查并运行所有程序。

您需要以某种方式使用obj,以避免热点优化整个for循环。

为了方便起见,请粘贴两个程序的输出。微基准测试几乎不可能编写直截了当。您可以阅读的答案,了解一些原因。这是一个非常小的测试,您至少应该运行相同的测试N次,错误随着N的增加而变小。还可以从测试中删除对象分配。obj从未被读取,因此hotspot可能会看到写入obj可以被优化。答案很好,但LinkedLists也可以向后遍历,这意味着最差的插入/删除点位于列表的中间而不是末尾。
 import java.util.LinkedList;

  public class Time1 
  {

        public static void main(String args[])
{
      int n=100000;
      long milis = System.currentTimeMillis();
      LinkedList obj=new LinkedList();

    for(int k=0;k<=n;k++)
    {
        obj.add(k);



    }
    System.out.println("insert linklist takes "
           +(System.currentTimeMillis()-milis)+" ms");
}

 }