增强for循环_LinkedList给我深深的上了节for增强的课

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

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

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

21442b3f69fdb4530cc50bbdd80484ab.png

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

使用jad查看反编译代码

931d2aa0bcf6d4abe5366fdde11da7c3.png

jad命令

9889d88e7829b51e001c0456e69bf34b.png

jad反编译代码

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

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

9dc1f517f75f6c800102ddfff68ae318.png

未编译代码集合

44e4bde778e6dc244c5cba830b95bb27.png

jad反编译代码

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

64aadb68ab8a1a0af862be6fe1a79ea8.png

arraylist测试

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

c75a9ec7ff9f9d4245c3c364f40ca9b5.png

LinkedList测试

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

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

4a5e8bdee775363bf7fc92866045fe8d.png

for增强缺点

总结:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值