ArrayList vs LinkedList

 public static void main(String[] args) {

        int SIZE = 100000;

        /**
         * 尾插
         */
        List<String> al = new ArrayList<>();

        long start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al.add("a");
        }
        System.out.println("al tail add:" + (System.nanoTime() - start));

        List<String> ll = new LinkedList<>();
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll.add("a");
        }
        System.out.println("ll tail add:" + (System.nanoTime() - start));

        List<String> al1 = new ArrayList<>(SIZE);
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al1.add("a");
        }
        System.out.println("fixed al tail add:" + (System.nanoTime() - start));

        List<String> ll1 = new LinkedList<>();
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll1.add("a");
        }
        System.out.println("fixed ll tail add:" + (System.nanoTime() - start));

        /**
         * 头插
         */
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al.add(0, "a");
        }
        System.out.println("al head add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll.add(0, "a");
        }
        System.out.println("ll head add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al1.add(0, "a");
        }
        System.out.println("fixed al head add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll1.add(0, "a");
        }
        System.out.println("fixed ll head add:" + (System.nanoTime() - start));


        /**
         * 中插
         */
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al.add(SIZE/2, "a");
        }
        System.out.println("al middle add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll.add(SIZE/2, "a");
        }
        System.out.println("ll middle add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al1.add(SIZE/2, "a");
        }
        System.out.println("fixed al middle add:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll1.add(SIZE/2, "a");
        }
        System.out.println("fixed ll middle add:" + (System.nanoTime() - start));
        

        /**
         * 顺序查
         */
        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al.get(i);
        }
        System.out.println("al get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll.get(i);
        }
        System.out.println("ll get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            al1.get(i);
        }
        System.out.println("fixed al get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = 0; i < SIZE; i++) {
            ll1.get(i);
        }
        System.out.println("fixed ll get:" + (System.nanoTime() - start));


        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al.get(i);
        }
        System.out.println("al get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll.get(i);
        }
        System.out.println("ll get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al1.get(i);
        }
        System.out.println("fixed al get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll1.get(i);
        }
        System.out.println("fixed ll get:" + (System.nanoTime() - start));


        /**
         * 随机查
         */
        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al.get(new Random().nextInt(SIZE));
        }
        System.out.println("al random get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll.get(new Random().nextInt(SIZE));
        }
        System.out.println("ll random get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al1.get(new Random().nextInt(SIZE));
        }
        System.out.println("fixed al random get:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll1.get(new Random().nextInt(SIZE));
        }
        System.out.println("fixed ll random get:" + (System.nanoTime() - start));

        /**
         * 随机删
         */
        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al.remove(new Random().nextInt(SIZE));
        }
        System.out.println("al random remove:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll.remove(new Random().nextInt(SIZE));
        }
        System.out.println("ll random remove:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            al1.remove(new Random().nextInt(SIZE));
        }
        System.out.println("fixed al random remove:" + (System.nanoTime() - start));

        start = System.nanoTime();
        for (int i = SIZE - 1; i > 0; i--) {
            ll1.remove(new Random().nextInt(SIZE));
        }
        System.out.println("fixed ll random remove:" + (System.nanoTime() - start));
    }

运行结果:

al tail add:3476287
ll tail add:12657766
fixed al tail add:2349552
fixed ll tail add:3199254
al head add:4009849812
ll head add:11752717
fixed al head add:3359037325
fixed ll head add:3220743
al middle add:4505144487
ll middle add:10911259343
fixed al middle add:4503587278
fixed ll middle add:9124624321
al get:2470068
ll get:10483634464
fixed al get:2263320
fixed ll get:9477721595
al get:2190044
ll get:10480103479
fixed al get:2072280
fixed ll get:9486833340
al random get:16256970
ll random get:10378181703
fixed al random get:9590445
fixed ll random get:9559484091
al random remove:4223582539
ll random remove:14814423490
fixed al random remove:4232083623
fixed ll random remove:13570980099

结论:LinkedList仅在头插情况下有优势,本文其他测试例下均逊于ArrayList。中插和随机删按常规预估应该是LinkedList快,但实际还是不如ArrayList。原因:大量数据的情况下,ArrayList的System.arraycopy的效率要比LinkedList从端开始查找index和分配node快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值