本文目标是加强for循环和普通for循环的比较。阅读本文大概3-5分钟

刚开始学习编程语言的时候接触了三种循环方式

1. for  常用

2. while  较常用

3 do ... while  不常用

一般的for循环格式

for(int i=0; i <10;i++){
  doSomething();
}

for(init ; condition ; increment),共有三个代码块

init 初始化区域

condition 设置判断条件

increment做完循环体内容后执行的代码块

现在看下for循环和加强for循环做同样一件事有何区别(使用集合Collection)

例如:两颗骰子,打印所有可能出现的点数。

数据

        Integer []face = {1,2,3,4,5,6};
Integer []face2 = {1,2,3,4,5,6,7};//额外多加了一个7,是为了验证容易出现的错误。
//将数组转换成集合,Arrays.asList方法只能用对象数组,不能用基本类型数组,会出现逻辑性错误,即集合中只有一个元素,face自身
Collection<Integer> dot1 = Arrays.asList(face);
Collection<Integer> dot2 = Arrays.asList(face2);

1. 正常的for循环遍历集合方法。

隐含错误的代码

// 循环打印出所有的可能。
for (Iterator<Integer> i = dot1.iterator(); i.hasNext();) {
// Integer tempI = i.next();
for (Iterator<Integer> j = dot2.iterator(); j.hasNext();) {
System.out.println("(" + i.next() + "," + j.next() + ")");
}
}

不可以在内层循环中调用外层i元素的next()方法

代码中。i.next()方法会将当前游标移到下一节点。即current=next; current.next = next.next

因为,dot2的元素比dot1的元素多。当循环6次后,i.next()没有下一个元素,就会报NoSuchElementException异常

正确的代码,使用临时变量保存 i 的下一节点引用

         Integer []face = {1,2,3,4,5,6};
Integer []face2 = {1,2,3,4,5,6,7};//额外多加了一个7,是为了验证容易出现的错误。
//将数组转换成集合
Collection<Integer> dot1 = Arrays.asList(face);
Collection<Integer> dot2 = Arrays.asList(face2);
//循环打印出所有的可能。
for(Iterator<Integer> i =dot1.iterator();i.hasNext();) {
Integer tempI = i.next();
for(Iterator<Integer> j =dot2.iterator();j.hasNext();) {
System.out.println("("+tempI+"数据"+j.next()+")");
}
}

执行结果,为了更好截图,代码做了换行改动

2. 加强for循环

代码比较简洁

for(Integer i:dot1) {
for(Integer j : dot2) {
System.out.print("("+i+","+j+")");
}
}

运行结果和上面也是一样的

嵌套循环遍历实现了Iterator接口的类时,代码跟普通for循环有所不同

直接避免的内层循环中i.next造成异常的问题,而且还不用自己创建临时变量

加强for循环好处:简洁性,避免bug

是iterator迭代方式的一种替换。

缺点:

  遍历部分想要的内容比较麻烦,比如想要获取第6位到第9位的下标的数据,也需要引入额外变量

  获取当前元素的索引值麻烦。

  只能遍历实现了Iterator接口的对象或数组

相对于上面的来说,好像普通for循环功能更加强大(……

  1. 普通for循环可以控制自己想要的循环条件
  2. 可以在特定下标处执行代码
  3. 使用方式比较灵活

想不出来了emmm.....

对于使用时,只是需要迭代遍历数据就使用加强for循环吧!

最新文章

  1. 无限分级和tree结构数据增删改【提供Demo下载】
  2. swift基础:第六部分:类与对象
  3. Ubuntu 14.10 下安装navicat
  4. iOS开发之监测网络状态
  5. php 和thinkphp 对excel操作
  6. innerHTML与appendChild(newnodeText)的区别
  7. VMware三种网络模式
  8. flask中jinjia2模板引擎使用详解5
  9. C++ 编程技巧笔记记录(持续更新)
  10. 安卓权限申请处理框架Android-UsesPermission
  11. Centos 7 安装Docker-ce记录
  12. Windows下bat脚本自动发邮件
  13. 【SpringBoot】息队列介绍和SpringBoot2.x整合RockketMQ、ActiveMQ
  14. rapidjson常见使用示例
  15. 在Intellij IDEA中修改模板中user变量名称
  16. canvas 动画 时钟clock
  17. SpringMVC由浅入深day01_8springmvc和mybatis整合
  18. java安全体系之JCA、JCE、JAAS、JSSE及其关系
  19. CSS3之 :nth-child(n)语法讲解
  20. EularProject 32: 数字1-9排列构成乘法等式

热门文章

  1. Ubuntu安装spyder并添加快捷方式
  2. spring整合quartz时间任务调度框架
  3. Magic Powder - 2 (CF 670_D)
  4. POJ3280--Cheapest Palindrome(动态规划)
  5. linux 查看、关闭 ssh pts/n登录的用户
  6. PB常用函数
  7. 分形之花篮(Flower Basket)
  8. 使用c# 实现冒泡排序
  9. Strust2总结
  10. 使用Squid部署代理服务