资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
java 1.5 中 for 循环的新写法 收藏 J2SE 1.5 新特性之增强 For 循环J2SE 1.5 提供了另一种形式的 for 循环。借助这种形式的 for 循环,可以用更简单地方式来遍历数组和 Collection 等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。 在 Java 程序中,要“逐一处理”或者说, “遍历”某一个数组或 Collection 中的元素的时候,一般会使用一个 for 循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为 for 这个词的长度比较短,还是因为 for 这个词的含义和这种操作比较配,在这种时候 for 循环比其它循环常用得多) 。 对于遍历数组,这个循环一般是采取这样的写法: 清单 1:遍历数组的传统方式 /* 建立一个数组 */ int integers = 1, 2, 3, 4; /* 开始遍历 */ for (int j = 0; j (全部元素都是 String 的 Collection)等。 清单 10:使用要被遍历的对象中的元素的上级类型的循环变量 String strings = A, B, C, D; Collection list = java.util.Arrays.asList(strings); for (Object str : list) System.out.println(str);/* 依次输出“A” 、 “B”、 “C”、 “D” */ 循环变量的类型可以和要被遍历的对象中的元素的类型之间存在能自动转换的关系。J2SE 1.5 中包含了“Autoboxing/Auto-Unboxing ”的机制,允许编译器在必要的时候,自动在基本类型和它们的包裹类(Wrapper Classes)之间进行转换。因此,用 Integer 型的循环变量来遍历一个 int型的数组,或者用 byte 型的循环变量来遍历一个 Collection,也是可行的。 清单 11:使用能和要被遍历的对象中的元素的类型自动转换的类型的循环变量 int integers = 1, 2, 3, 4; for (Integer i : integers) System.out.println(i);/* 依次输出“1 ”、 “2”、 “3”、 “4” */ 注意,这里说的“元素的类型” ,是由要被遍历的对象的决定的如果它是一个Object型的数组,那么元素的类型就是 Object,即使里面装的都是 String 对象也是如此。 可以限定元素类型的 Collection 截至到 J2SE 1.4 为止,始终无法在 Java 程序里限定 Collection 中所能保存的对象的类型它们全部被看成是最一般的 Object 对象。一直到 J2SE 1.5 中,引入了“泛型(Generics) ”机制之后,这个问题才得到了解决。现在可以用 Collection来表示全部元素类型都是 T 的 Collection,如 Collection、Collection等。不过这里的 T 不能是一个简单类型,象 Collection之类的写法是不被认可的。 - 4. 被这样遍历的前提 有两种类型的对象可以通过这种方法来遍历数组和实现了 java.lang.Iterable 接口的类的实例。试图将结果是其它类型的表达式放在这个位置上,只会在编译时导致一个提示信息是“foreach not applicable to expression type”的问题。 java.lang.Iterable 接口中定义的方法只有一个: iterator() 返回一个实现了 java.util.Iterator 接口的对象 而 java.util.Iterator 接口中,则定义了这样三个方法: hasNext() 返回是否还有没被访问过的对象 next() 返回下一个没被访问过的对象 remove() 把最近一次由 next()返回的对象从被遍历的对象里移除。这是一个可选的操作,如果不打算提供这个功能,在实现的时候抛出一个 UnsupportedOperationException 即可。因为在整个循环的过程中,这个方法根本没有机会被调用,所以是否提供这个功能,在这里没有影响。 借助这两个接口,就可以自行实现能被这样遍历的类了。 清单 12:一个能取出 10 个 Object 元素的类 import java.util.*; class TenObjects implements Iterable public Iterator iterator() return new Iterator() private int count = 0; public boolean hasNext() return (count ” 。 在所有出现 java.util.Iterator 的地方,都写成“Iterator” 。 在实现 java.util.Iterator 的接口的时候,用 T 作为 next()方法的返回值类型。 注意,这里的 T 不能是一个基本类型。如果打算用基本类型作为循环变量,那么得用它们的包裹类来代替这里的 T,然后借助 Auto-Unboxing 机制,来近似的达到目的。 清单 13:用 int 型的循环变量来遍历一个能取出 10 个 Integer 元素的类 import java.util.*; public class TenIntegers implements Iterable public Iterator iterator() return new Iterator() private int count = 0; public boolean hasNext() return (count , Iterable”的写法,是不能通过编译的。所以,没有办法让一个可遍历对象能在这样遍历时,既可以使用 Integer,又可以使用 String 来作为循环变量的类型(当然,把它们换成另外两种没有继承和自动转化关系的类也一样行不通) 。 6. 归纳总结 借助 J2SE 1.5 中引入的第二种 for 循环,可以用一种更简单地方式来完成遍历。能用这种方法遍历的对象的类型,可以是数组、Collection 或者任何其它实现了 java.lang.Iterable接口的类。通过跟同样是在 J2SE 1.5 中引入的泛型机制配合使用,可以精确的控制能采用的循环变量的类型。而且,因为这么编写的代码,会在编译期间被自动当成是和传统写法相同的形式,所以不必担心要额外付出性能方面的代价。 本文来自 CSDN 博客,转载请标明出处:http:/blog.csdn.net/remote_roamer/archive/2009/10/28/4737953.aspx
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号