dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>java基础>文章内容
java foreach
来源: 作者:

JDK5.0中对for语句增加了一种形式,和其他语言中的foreach比较像,所以题目取名叫JAVA中的foreach.该形式的具体语法如下:for(声明:表达式).解释一下,也就是说冒号前面是声明一个临时变量,在下面的语句中进行引用.冒号后面是表达式,应该为集合或者数组

这样看起来可能不太明白.用实例看一下:

for (Object listElement : list) {
    System.out.println(listElement.toString());
    }

这样是不是简介了许多?list为一个list对象.JDK5以前的实现方式一般是加一个临时变量i,或者是用iterator.代码如下:

for (Iterator i = list.iterator(); i.hasNext(); ) {
    Object listElement = i.next();
    out.println(listElement.toString());
    }

或者

for (int i=0;i<list.size();i++) {
    Object listElement = list.get(i);
    out.println(listElement.toString());
    // Do something else with this list element
}
相比之下,这个for的新的形式确实是使代码简洁不少.那么这种形式的原理是什么呢?它做法很聪明,只是在编译的时候转换成如下形式:

for (Iterator<E> #i = (expression).iterator(); #i.hasNext(); ) {
        declaration = #i.next();
        statement
}

这样估计减少了修改javac的工作量.这样做还有一个优点:如果你想用自己定义的集合来使用这种形式,很简单,只需要实现java.lang.iterable接口就可以了.

任何事物都有两面,这样做的缺点是什么呢?

这种形式的一个最大的缺点就是不能访问元素在这个集合中的定位,举个例子来说:

for (int i=0; i<args.length; i++) {
    wordList.add("word " + (i+1) + ": '" + args[i] + "'");
}
    
    
for (String word : wordList) {
    out.println(word);
}

这两个例子说明了问题.没法访问定位,也就没办法修改,删除这个集合中的内容.前面已经说了,这种形式是转换为Iterator形式使用的.所以Iterator能做到的,他就能做到.这种写法这么简洁,如果你只是要遍历这个集合,数组,这种写法非常适合.

这里还有需要注意的一个问题,数组集合中如果是对象的话,在声明中要定义成Object类型,不要定义成集合中数据的类型,比如下面的代码:

List list=new ArrayList();
  list.add("test1");
  list.add("test2");
  list.add("test3");
  list.add("test4");
  for(String test:list){
   System.out.println(test);
  }

这种写法会报错,因为Iterator本来就是返回的Object对象,不能从Object转为String.

可以通过JDK5中的范型来解决,可以写成下面的形式:

List<String> list=new ArrayList<String>();
  list.add("test1");
  list.add("test2");
  list.add("test3");
  list.add("test4");
  for(String test:list){
   System.out.println(test);
  }


上一篇:hibernate登录例子代码   下一篇:php正则问题
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·JUnit单元测试(2)
·JUnit单元测试(1)
·浅谈在Java语言中究竟是传值还是
·Java 5.0 多线程编程实践
·Java的文件 读和写
·对于JAVA基础测试中常见的异常问
·JAVA程序员面试33问,你能回答多
·Java Reflection (JAVA反射)详解
·JAVA中配置环境变量设置方法大全
·讲述java语言中内部类的研究
·详细解析Java中抽象类和接口的区
·Java开发中的事件驱动模型实例详
  相关文章
·如何调用JavaBean
·Java输入输出(Java IO)处理概
·讨论 Java 技术新手入门
·怎么向一个命令行Java程序传递参
·Java/J2EE中文问题终极解决之道
·Java语言的参数传递和处理方法 -
·Java语言的克隆与深层次克隆技术
·JDOM操作XML简单示例
·java学习----理解面向对象的程序
·Vector & ArrayList 哪一个更好
·ANT安装、配置
·深入 JAVA对象的复制与比较
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763