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);
}

