• java5新特性-加强for循环


    本文目标是加强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 的下一节点引用

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

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

    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循环吧!

  • 相关阅读:
    easyui的dataGrid生成的日期时间,总是不能很好的兼容ie8和谷歌,终于摸索出一个合适的办法
    DELPHI使用TClientDataSet时不携带MIDAS.DLL的方法
    你又重新年轻了一次,这一次你打算怎么活?
    c#网站项目的发布:项目方式、webSite网站模式(未能获得项目引用XXX的依赖项的解决)
    当取不到raisError的错误信息只能取到return的错误代码时,可以取connection.errors[0].description
    layer iframe大致使用
    全选
    下拉选
    checkbox
    js判断值对否为空
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/10028295.html
Copyright © 2020-2023  润新知