【JAVA每日分享-5】ArrayList、LinkedList尾插效率比较?

896 阅读2分钟

大家都放假了吧,祝大家假期愉快~

在工作中我们经常会因为某些业务逻辑,需要向集合中频繁追加元素。

你有思考过用哪种集合?为什么?

重温下众所周知的概念(我看网上大部分都是写的概念,不容易让你理解记住,今天就不用大篇幅写了,改天详细写下):

ArrayList :基于动态数组的数据结构,插入删除效率低,随机访问相率高。

LinkedList : 基于链表的数据结构,插入删除效率高,随机访问效率低。

进入正题:

public void giveALike(){
        List<Integer> arrayList = new ArrayList<>();
        System.out.println("arrayList   startTime        " + System.currentTimeMillis());
        for (int i = 0; i < 1000; i++) {
            arrayList.add(i);
        }
        System.out.println("arrayList   endTime          " + System.currentTimeMillis());

        System.out.println("------------------------------宁点的赞,是对我最大的鼓励-------------------------------");

        LinkedList<Integer> linkedList = new LinkedList<>();
        System.out.println("linkedList  startTime        " + System.currentTimeMillis());
        for (int i = 0; i < 1000; i++) {
            linkedList.add(i);
        }
        System.out.println("linkedList  endTime          " + System.currentTimeMillis());
    
}

从运行结果你会发现循环1000次,毫秒无差。咱们改成1W再看看结果。

运行了N多次,你会得到三种结果,不能用数据结构的概念去对程序执行结果一概而论。

可能循环次数太少不明显,那咱们增加循环次数。

不知你对上面的结果是否有些意外。“不是链表的插入速度要比数组快吗”,基于数据结构的概念确实是如此,由于咱们尾插次数还不够大,没法充分展示‘链表’数据结构的优势。

1000W次(以下结果为执行10次,取大概值):

arrayList 毫秒差值3800+

linkedList 毫秒差值1400+

以上结果,仅为本机结果,不同配置的电脑执行效率会有一些差别。

在使用 arrayList 时,最好赋‘初始容量’减少、避免数组扩容,从而提升运行效率(对ArrayList插入数据越多,越能展现正确赋初始容量带来的性能)。

List<Integer> arrayList = new ArrayList<>(initialCapacity:初始容量);

对 ArrayList 初始化容量,运行10次结果基本都与上图结果偏差不大。

结论:

插入次数不是很多时(至于多少算‘很多’,没有具体的定论,需要自己去实践),大部分情况 ArrayList 就能很好的满足咱们的需求了。只有插入次数够多才能体现 LinkedList 链表结构所带来的优势。


“从计算机程序出现的第一天起,对效率的追求就是程序天生的坚定信仰,这个过程犹如一场没有终点、永不停歇的F1方程式竞赛,程序员是车手,技术平台则是在赛道上飞驰的赛车。” ——《深入了解java虚拟机》