ArrayList、LinkedList区别以及速度比较

众所周知
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

不过也不是一定的
当需要插入数据的时候,如果是在集合的前段(大概集合容量的前1/10)处插入数据时,linkedlist性能明显优于arraylist,但是!!!!当在集合的中部甚至靠后的位置插入大量数据时,arraylist的性能反而远远优于linkedlist,所以,linkedlist相较于arraylist的唯一优势在于集合前段的数据的插入

首先创建带数据的两个List, 然后在中间插入数据, 观察完成时间

public class Hero {
        public static void main(String[] args){
            listAndLink();
        }
                public static void listAndLink(){
            List<String> list = new ArrayList<String>();
            LinkedList<String> link = new LinkedList<String>();
            //生产数据
            for(int i = 0; i < 100000; i ++){
                list.add("dfghdffdhghdfghdfghians"+i);
                link.add("dfghdffdhghdfghdfghians"+i);
            }
            //标记开始时间
            long startlist = System.currentTimeMillis();
            //在list中间插入数据
            for(int i = 0; i < 10000; i ++){
                list.add((5000+i), "asdfasdfaasdf");
            }
            //标记结束时间
            long endlist = System.currentTimeMillis();
            System.out.println("list time==="+(endlist - startlist));
            
            //标记开始时间
            long startLink = System.currentTimeMillis();
            //在link中间插入数据
            for(int i = 0; i < 10000; i ++){
                link.add((5000+i), "asdfasdfaasdf");
            }
            //标记结束时间
            long endLink = System.currentTimeMillis();
            System.out.println("link time -----"+(endLink - startLink));
            
        }
}

结果
在这里插入图片描述

怎么会这样, 不应该是LinkedList更快吗? ArrayList底层是数组, 添加数据需要移动后面的数据, 而LinkedList使用的是链表, 直接移动指针就行, 按理说应该是LinkedList更快.

原因先不说, 接着改变插入位置, 再来试试

public class Hero {
        public static void main(String[] args){
            listAndLink();
        }
                public static void listAndLink(){
            List<String> list = new ArrayList<String>();
            LinkedList<String> link = new LinkedList<String>();
            //生产数据
            for(int i = 0; i < 100000; i ++){
                list.add("dfghdffdhghdfghdfghians"+i);
                link.add("dfghdffdhghdfghdfghians"+i);
            }
            //标记开始时间
            long startlist = System.currentTimeMillis();
            //在list中间插入数据
            for(int i = 0; i < 10000; i ++){
                list.add((i), "asdfasdfaasdf");
            }
            //标记结束时间
            long endlist = System.currentTimeMillis();
            System.out.println("list time==="+(endlist - startlist));
            
            //标记开始时间
            long startLink = System.currentTimeMillis();
            //在link中间插入数据
            for(int i = 0; i < 10000; i ++){
                link.add((i), "asdfasdfaasdf");
            }
            //标记结束时间
            long endLink = System.currentTimeMillis();
            System.out.println("link time -----"+(endLink - startLink));
            
        }
}

结果

在这里插入图片描述

从这里看确实是LinkedList比较快, 然后我又将插入位置改成9999, 结果如下

在这里插入图片描述

LinkedList的时间更长了, 现在大概知道了,插入位置的选取对LinkedList有很大的影响,

因为LinkedList在插入时需要向移动指针到指定节点, 才能开始插入,,一旦要插入的位置比较远,LinkedList就需要一步一步的移动指针, 直到移动到插入位置,这就解释了, 为什么节点值越大, 时间越长, 因为指针移动需要时间。

而ArrayList是数据结构, 可以根据下标直接获得位置, 这就省去了查找特定节点的时间,所以对ArrayList的影响不是特别大。

总结:总的来看增加删除元素LinkedList效率还是很快的,不过在一个很大的集合中如果要在集合靠后的位置重新插入一些新数据的话ArrayList就要快了

转自:https://blog.csdn.net/qq_21104515/article/details/80407805

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值