当前位置:首页>编程日记>正文

LinkedList 的作者说他自己都不用 LinkedList?

今天在网上冲浪,看到有文章说 LinkedList 的作者说他自己都不用 LinkedList,我就特意去翻了翻他的推特,发现他确实说过这话!

LinkedList 的作者说他自己都不用 LinkedList? 配图01可能这就是大佬吧,我造轮子,但是我不用!或者这就是传说中的厨子不吃自己做的菜?

不扯了,言归正传。其实我个人觉得大佬说好像是事实,因为在业务上好像都用不到 LinkedList ,大多数场景下都是用 ArrayList 比较合适,我细数了下自己平日里的使用情况,真的都是 ArrayList 。

说到这,可能有人不同意了,说我可是看过面试题的,LinkedList 可是有它的优势的!

这题我也看过,没记错的话应该是:说说 ArrayList 和 LinkedList 的之间区别?

我觉得这题可谓之为“八股文前三甲”,其实这题映射过来也就是关于数组与链表的比较。

只要你在网上看过这道面试题,你看到的答案必然是:

  • 数组的随机访问快,插入和删除慢

  • 链表的插入删除快,随机访问慢

  • 频繁增删的情况下,用链表比较合适

  • 在随机查找多的情况下,用数组比较合适

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

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

所以在实际使用的时候,如果你有频繁的增删,也不应该用链表。

不信?我们来做个实验看看咯。

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 万次随机的插入操作,然后分别统计耗时。

执行结果如下:

LinkedList 的作者说他自己都不用 LinkedList? 配图02是吧,在随机插入的情况下,链表不占优势反而大弱于数组!

所以说对于链表的插入操作,不能只关注其插入的时间复杂度,也要算上查找到前节点的开销,因此不能武断地说:频繁增删的情况下,用链表比较合适

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

LinkedList 的作者说他自己都不用 LinkedList? 配图03

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

LinkedList 的作者说他自己都不用 LinkedList? 配图04

所以,在数据量不大且操作次数不多的情况其实不必过于纠结到底用哪个。但在数据量较大且对时延敏感的情况下,建议还是做好测试,不能平白的根据一些“网上结论”而下定论。

好了,暂时扯到这。记住下次去面试别直接八股文硬上,咱们要多点质疑,加点个人思考,这样会让人觉得你更有东西。


http://www.coolblog.cn/news/1598010ba495c241.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐