ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

为何LinkedList的作者也不用它

2021-12-01 13:00:49  阅读:198  来源: 互联网

标签:COUNT LinkedList 耗时 list 不用 链表 插入 随机 为何


为何LinkedList的作者也不用它

说说ArrayList和LinkedList的之间区别?其实这题映射过来也就是关于数组与链表的比较。
只要你在网上看过这道面试题,你看到的答案必然是:

1.数组的随机访问快,插入和删除慢
2.链表的插入删除快,随机访问慢
3.频繁增删的情况下,用链表比较合适
4.在随机查找多的情况下,用数组比较合适

问题就出在链表的频繁增删这一点。如果单从增加查这三个方法的时间复杂度来看,确实如此,没有错。

但是,实际使用时,这个说法成立吗?其实完全不成立!你想想,如果你要在链表中删除某个元素,你首先得找到它!这个链表的查找可耗时的呀!

所以在实际使用的时候,如果你有频繁的增删,也不应该用链表。我们来做个测试:

public class YesArrayLinkedBattle {
  
    private static final int COUNT = 100000;

    static List<Integer> fillList(List<Integer> list) {
        for (int i = 0; i < COUNT; i++) {
            list.add(i); //将list填满,假装我们在数据库里得到这么多数据
        }
        return list;
    }
  
    static void randomAdd(List<Integer> list, String listType) {
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < COUNT; i++) {
            list.add(ThreadLocalRandom.current().nextInt(0,COUNT), i);
        }
        long t2 = System.currentTimeMillis();
        System.out.println(listType +"随机位置插入" + COUNT + "次耗时:" + (t2-t1));
    }

    public static void main(String[] args) {
        randomAdd(fillList(new ArrayList<>(COUNT)), "数组");
        randomAdd(fillList(new LinkedList<>()), "链表");
    }
}

这个实验很粗暴简单,但也很直观,分别对被填满数据的 ArrayList 和 LinkedList 执行 10 万次随机的插入操作,然后分别统计耗时。
执行结果如下:

数组随机插入10万次:耗时1943ms。
链表随机插入10万次:耗时29770ms。

是吧,在随机插入的情况下,链表不占优势反而大弱于数组!
所以说对于链表的插入操作,不能只关注其插入的时间复杂度,也要算上寻找到前节点的开销,因此不能武断地说:频繁增删的情况下,用链表比较合适

当然,如果数据量很小的话,其实两者都是差不多的,比如长度都为 100 ,执行 100 次,则耗时如下:

数组随机插入100次:耗时1ms。
链表随机插入100次:耗时1ms。

长度都为 1000 ,执行 1000 次,则耗时如下:

数组随机插入1000次:耗时2ms。
链表随机插入1000次:耗时2ms。

所以,在数据量不大且操作次数不多的情况其实不必过于纠结到底用哪个。

但在数据量较大且对时延敏感的情况下,建议还是做好性能测试,不能平白的根据一些“网上结论”而下定论。

标签:COUNT,LinkedList,耗时,list,不用,链表,插入,随机,为何
来源: https://www.cnblogs.com/JaxYoun/p/15628445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有