Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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
为什么ArrayList在开始时插入元素比java中的LinkedList花费更多的时间_Java_List_Data Structures_Arraylist - Fatal编程技术网

为什么ArrayList在开始时插入元素比java中的LinkedList花费更多的时间

为什么ArrayList在开始时插入元素比java中的LinkedList花费更多的时间,java,list,data-structures,arraylist,Java,List,Data Structures,Arraylist,我认为ArrayList在开始时插入元素的复杂性很高,因为它将其余元素向右移动了一个位置。LinkedList最后必须插入元素,因为它必须遍历每个元素。因此,上述两个操作所花费的时间应该是可比较的,但实际上,当我这样做时,arraylist在开始时插入需要34057毫秒,LinkedList在结束时插入只需要41毫秒,而这两个操作都具有时间复杂性。为什么会这样 就空间复杂度而言,哪一个更好 这是我的密码 public void timeTakenEnd(String name, List<

我认为ArrayList在开始时插入元素的复杂性很高,因为它将其余元素向右移动了一个位置。LinkedList最后必须插入元素,因为它必须遍历每个元素。因此,上述两个操作所花费的时间应该是可比较的,但实际上,当我这样做时,arraylist在开始时插入需要34057毫秒,LinkedList在结束时插入只需要41毫秒,而这两个操作都具有时间复杂性。为什么会这样

就空间复杂度而言,哪一个更好

这是我的密码

public void timeTakenEnd(String name, List<Integer> list) {


    for (int i = 0; i < 1E5; i++) {
        list.add(i);

    }


    long start = System.currentTimeMillis();
    for (int i = 0; i < 1E5; i++) {
        list.add(i);

    }

    long end = System.currentTimeMillis();

    System.out.println("time taken for: " + name + " to insert elements in the end is  " + (end - start));

}

public void timeTakenBeg(String name, List<Integer> list) {


    for (int i = 0; i < 1E5; i++) {
        list.add(i);

    }


    long start = System.currentTimeMillis();
    for (int i = 0; i < 1E5; i++) {
        list.add(0, i);

    }

    long end = System.currentTimeMillis();

    System.out.println("time taken for: " + name + "to insert elements in the beginning is  " + (end - start));

}

public static void main(String[] args) {

    ArrayList<Integer> alist = new ArrayList<Integer>();
    LinkedList<Integer> llist = new LinkedList<Integer>();

    TimeComplexity demo = new TimeComplexity();

    demo.timeTakenEnd("arrarylist", alist); //25 miliseconds on my machine
    demo.timeTakenEnd("linkedlist", llist);//41 miliseconds on my machine

    demo.timeTakenBeg("arraylist", alist);// 34057 miliseconds on my machine
    demo.timeTakenBeg("linkedlist", llist); //60 miliseconds on my machine

}
}LinkedList是一个双链接列表。它记住它的第一个和最后一个元素,并允许在两个方向上遍历列表

因此,在末尾添加一个元素只是创建一个节点并分配最后一个、下一个和上一个指针的步骤。是O1

请注意,Java是开源的,源代码随JDK提供。您可以很容易地找到实现:

public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}
LinkedList是一个双链接列表。它记住它的第一个和最后一个元素,并允许在两个方向上遍历列表

因此,在末尾添加一个元素只是创建一个节点并分配最后一个、下一个和上一个指针的步骤。是O1

请注意,Java是开源的,源代码随JDK提供。您可以很容易地找到实现:

public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

正如其名称和Javadoc所示,ArrayList是由数组在内部实现的

因此,插入项目涉及将其后面的所有项目向前移动一个位置


另一方面,LinkedList只需重定向项的引用即可插入新节点,因此其时间更加恒定。

正如其名称和Javadoc所示,ArrayList在内部由数组实现

因此,插入一个项目需要将所有项目移到后面,向前移动一个位置


另一方面,LinkedList只需重定向项的引用即可插入新节点,因此其时间更恒定。

数组列表使用连续存储,因此在开始插入时需要将所有现有元素上移一个,或者重新分配整个列表。只要链接设置正确,链表就可以将新元素放在任何位置。不需要移动列表中的其他元素,只需调整几个链接。

数组列表使用连续存储,因此开头的插入要求将所有现有元素上移一个,或者重新分配整个列表。只要链接设置正确,链表就可以将新元素放在任何位置。不需要移动列表中的其他元素,只需调整几个链接。

现在有意义了我不知道它在java中实现为双链接列表Thank mate现在有意义了我不知道它在java中实现为双链接列表Thank mate