Java中队列和链表性能对比-ArrayList和LinkedList

本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。

 

具体代码如下,可以直接运行

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Demo07_list {

    public static void main(String[] args) {
        List<Integer> link = new LinkedList<Integer>();
        List<Integer> list = new ArrayList<>();
        Integer m = new Integer(10);


        int time1 = (int) System.currentTimeMillis();
        for (int i=0;i<1000000;i++){
            link.add(m);
        }
        int time2 = (int) System.currentTimeMillis();
        System.out.println(time2 - time1);

        int time3 = (int) System.currentTimeMillis();
        for (int j=0;j<1000000;j++){
            list.add(m);
        }
        int time4 = (int) System.currentTimeMillis();
        System.out.println(time4 - time3);

        /**
         * 像上面这种for循环逐个新增,其实link和list效率差别不大。link有底层维护可以直接找到的lastnode,list可以直接index找到last
         * link效率高的地方是insert,只需要挪动一个;list需要所有挪动
         *
         */

        time1 = (int) System.currentTimeMillis();
        for(int i=0;i<1000000;i++){
            link.get(i);
        }
        time2 = (int) System.currentTimeMillis();
        System.out.println(time2 - time1);

        time3 = (int) System.currentTimeMillis();
        for (int j=0;j<1000000;j++){
            list.get(m);
        }
        time4 = (int) System.currentTimeMillis();
        System.out.println(time4 - time3);

        /**
         * get的时候每次获取,link都需要从头遍历;list只需要index就可以找到对应的元素
         *
         */
    }
}

  

最终输出结果

16
11
340337
3

 

其中get耗时较久。最终结果如同上一篇博客中提到的两者差距(但是其实实际结果add的时候,性能差别不是特别大,可以是因为数据类型的问题)

 

底层结构

增删效率

改查的效率

ArrayList

可变数组

较低,通过数组扩容

较高,不需要改变数组

LinkedList

双向链表

较高,通过链表追加

较低,需要通过node一个个遍历找到后操作

如何选择?

  • 如果改查操作较多,选择ArrayList
  • 如果增删操作较多,选择LinkedList
  • 一般来说在程序中大多数都是查询,因此大部分情况下会选择ArrayList
  • 不适合用于多线程,LinkedList和ArrayList的线程不是安全的

 

备注:

为什么node删除总是可以找到最后一个?

node底层实际上维护了一个双向链表,看源码native修饰的node属性的对象,这就是指向的last node。

posted @ 2022-10-01 16:02  cccrush  阅读(255)  评论(0)    收藏  举报