前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LinkedList给我深深的上了节for增强的课

LinkedList给我深深的上了节for增强的课

作者头像
IT大咖说
发布2020-02-21 18:28:20
4130
发布2020-02-21 18:28:20
举报
文章被收录于专栏:IT大咖说IT大咖说

标题既然这么说,就证明它的确坑了我一把。在平时习惯使用了普通的for循环。所以在写遍历的时候也是经常使用这种。然而一味的使用它,给我带来了麻烦。项目开发中,有一个需求是插入多,读少的需求。想着这不是LinkedList的特性吗,就果断的使用了它。然而不久,同事反馈这个业务在读取时,时间特别长。开始想本来LinkedList读就慢嘛,后来一个公司一个大佬看见了我这部分的代码,这个地方慢的另外一个原因是因为我使用了普通的for循环。应该使用for增强形式。

这里小编提一个疑问哈:“java中哪些数据类型可以用于增强for循环”?这是在群里看见的一个面试题,网上没有找到答案,我认为是基本类型和引用类型都可以,还有就是实现了Iterable接口的,比如集合。有知道答案的可以在下面评论下。不胜感激。

步入正题:首先看下在数组中有什么差异

未编译代码,也就是我们程序员写的

使用jad查看反编译代码

jad命令

jad反编译代码

从反编译代码中,可以看出数组中没有什么差别。基本一致。只不过for增强写法上简单明了些。性能上没有什么差别。

在看下在集合中有什么差异

未编译代码集合

jad反编译代码

可以看得出普通for和for增强使用了2种不一样的方式实现,那么那个性能更好呢。

arraylist测试

测试了几次,发现执行时间差不多,并且普通for还比for增强快了些。那在看看LinkedList

LinkedList测试

性能上立马体现出来了。普通for慢很多。看过arraylist和LinkedList源码的肯定知道八九不离十了。我这里就说下结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

那for增强有没有什么缺点呢,肯定是有的,上面的代码中for增强最终会变成Iterator遍历。Iterator的缺点也就是它的缺点了。如在迭代的过程中,除了使用迭代器(如:Iterator.remove()方法)对集合增删元素外,是不允许直接对集合进行增删操作。否则将会抛出 ConcurrentModificationException异常。

for增强缺点

总结:

  1. 无论是在数组中还是在集合中,加强型for循环都是它们各自的普通for循环的一种“简写方式”,即两者意思上是等价的,但前者方便简单,建议多使用。
  2. for增强不能完全代替普通for循环,因为for增强有一定的局限性。(如数组中不能替换相应索引下的值;集合中不能对集合进行增删操作、也不能获取索引)
  3. for增强只能用于数组、Iterable类型(包括集合)。
  4. 集合中的for增强本质上使用了Ierator迭代器,所以要注意Itrator迭代陷阱。 来源:https://www.toutiao.com/a6770198853497913869/

来都来了,走啥走,留个言呗~

IT大咖说 | 关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档