for循环的缺点:
对于for循环遍历,我们很容易出现这样的一些低级错误:

对于数组

for(int i = 0 ; i >100 ; i++)
for(int i = 100 ; i >=0 ; i++)

我们有时候会写出像这样一时短路写出来的代码~原因很简单,i出现了三次,每个i我们都要小心!
但是for-each循环就不同了,全程都没有出现 i 好吧,何来错误?

对于集合

enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }Collection< Face > faces = Arrays.asList(Face.values());for(Iterator< Face > i = faces.iterator(); i.hasNext();) {for(Iterator< Face > j = faces.iterator(); j.hasNext();){ System.out.println(i.next() + " " + j.next());}}

看,i是外层循环,但是在内循环中不断i.next(),导致了错误。这也是疏忽导致的,我们需要在外层循环中记录下i.next()

像这样

enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }Collection<Face> faces = Arrays.asList(Face.values());for(Iterator<Face> i = faces.iterator(); i.hasNext();){Face face = i.next();for(Iterator<Face> j = faces.iterator(); j.hasNext();) {System.out.println(face + " " + j.next());}}

来看for-each循环:

for(Face face1 : faces)for(Face face2 : faces)System.out.println(face1 + " " + face2);

实在是太优雅了!!

但是在for-each循环有两个小缺点,相信大家在编程的时候也类词的情况:

  • for-each得不到索引,这是个很尴尬的问题,导致所有需要索引的操作的行不通。比如书中提到的转换,平行迭代。
  • for-each无法删除集合中的元素。原因很简单,迭代器是删除元素的御用神器啊啊啊

总结:能用for-each就用它,又容易写有整洁,除非要删除元素或者用到索引才用普通for。

Effective Java之for-each循环优先于for循环(四十六)相关推荐

  1. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

    Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...

  2. 四十六、深入Java的网络编程(下篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  3. 【零基础学Java】—throw关键字(四十六)

    [零基础学Java]-throw关键字(四十六) 一.throw关键字 public class demo {public static void main(String[] args) {//创建i ...

  4. Effective Java之考虑用序列化代理代理序列化实例(七十八)

    我们知道,实现了序列化的类.在反序列化时,实例的创建是由readObject方法来完成的.由于这是一个不同于构造函数的创建类实例的通道,因此在构造函数中的状态约束条件在readObjetc中也得一条不 ...

  5. Effective Java之通过私有构造器强化不可实例化能力(四)

    比如很多工具类,成员都是静态的,你写这个类的原因是想拿来直接用,而不需要实例化的 但是在缺少显示构造函数的时候,编译器会给你默认生成一个构造函数,这样这个类就有可能实例化 企图将类做成抽象类来强制该类 ...

  6. JAVA学习第四十六课 — 其它对象API(二)Date类 amp; Calendar类(重点掌握)

    Date类(重点) 开发时,会时常遇见时间显示的情况,所以必须熟练Date的应用 <span style="font-family:KaiTi_GB2312;font-size:18p ...

  7. Java从零开始学四十六(Junit)

    一.软件测试 软件开发: 项目调研--需求分析--软件设计--程序编码--软件测试--运行维护 软件测试:利用测试工具按照测试方案和流程对产品进行功能和性能测试,使用人工或者自动手段来运行或测试某个系 ...

  8. 夜光带你走进 Java 成神之路--Spring(四十六)擅长的领域

    夜光序言: 人生不要被过去所控制,决定你前行的,是未来; 人生不要被安逸所控制,决定你成功的,是奋斗; 人生不要被别人所控制,决定你命运的,是自己; 人生不要被金钱所控制,决定你幸福的,是知足; 人生 ...

  9. 一文简单理解《Effective Java》建议

    考虑用静态工厂方法替代构造方法 传统的获取一个对象实例,通常是通过构造方法,new一个对象:不同数量的入参,会有不同的构造方法: 例如,统一的返回结果类,传统方式(伪代码)如下: //成功 retur ...

最新文章

  1. Python爬虫CSS Selector的使用
  2. 数据流程图顶层一层二层_只需三个公式,三阶魔方超简单入门图文教程5:完全复原第二层...
  3. cad线性标注命令_CAD线性标注如何使用的
  4. pythontcp文件传输_python socket实现文件传输(防粘包)
  5. VS.NET调试问题
  6. 面试算法工程师时,我居然被化学专业转行的老哥血虐了
  7. c语言实现bf算法的定位函数,数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...
  8. java高并发日志_高并发下log4j的性能瓶颈
  9. linux 程序/usr
  10. Linux 统计代码行数
  11. K - Repeating Decimals(循环小数)
  12. python multiprocess queue_Python:Multiprocessing Queue.put不适用于半大数...
  13. 企业微信的一周小结是怎么统计的?
  14. kafka学习七:kafka之集群篇
  15. 手把手教如何用bib文件在latex里引用文献
  16. 花瓣网 html,css+html如何仿花瓣网实现静态登陆页面?(代码实
  17. python检索论文_一种基于Python的音乐检索方法的研究
  18. Flink 1.10 SQL、HiveCatalog与事件时间整合示例
  19. TCP/IP 之蓟辽督师
  20. 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?

热门文章

  1. VC C/C++ 4种方法获取文件大小 Windows API
  2. 3_8 StateMode 状态模式
  3. forceinline关键字
  4. 你已经用上 5G 网络了吗?
  5. 干货 | 阿里巴巴HBase高可用8年抗战回忆录
  6. KCL:声明式的云原生配置策略语言
  7. 美摄智能生产平台,轻松搞定视频制作——对话美摄科技研发总监黄裔
  8. LiveVideoStack 主编观察 01
  9. 华为云视频Cloud Native架构设计与工程实践
  10. dav1d 0.5.1:更快!