1、 J2SE 1.5 提供了另一种形式的 for 循环。借助这种形式的 for 循环,可以用更简单地方式来遍历数组和 Collection 等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。在 Java 程序中,要“逐一处理”?D?D 或者说, “遍历”?D?D 某一个数组或 Collection 中的元素的时候,一般会使用一个 for 循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为 for 这个词的长度比较短,还是因为 for 这个词的含义和这种操作比较配,在这种时候 for 循环比其它循环常用得多) 。对于遍历数
2、组,这个循环一般是采取这样的写法:清单 1:遍历数组的传统方式/* 建立一个数组 */int integers = 1, 2, 3, 4;/* 开始遍历 */for (int j = 0; j strings = new ArrayList();strings.add(“A“);strings.add(“B“);strings.add(“C“);strings.add(“D“);for (String str : integers) System.out.println(str);/* 依次输出“A”、 “B”、 “C”、 “D” */循环变量的类型可以是要被遍历的对象中的元素的上级类型。例如
3、,用 int 型的循环变量来遍历一个 byte型的数组,用 Object 型的循环变量来遍历一个 Collection(全部元素都是 String 的 Collection)等。清单 11:使用要被遍历的对象中的元素的上级类型的循环变量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” */循环变量的类型可以和要被遍历的对象中的
4、元素的类型之间存在能自动转换的关系。J2SE 1.5 中包含了 “Autoboxing/Auto-Unboxing”的机制,允许编译器在必要的时候,自动在基本类型和它们的包裹类(Wrapper Classes)之间进行转换。因此,用 Integer 型的循环变量来遍历一个 int型的数组,或者用 byte 型的循环变量来遍历一个 Collection,也是可行的。清单 12:使用能和要被遍历的对象中的元素的类型自动转换的类型的循环变量int integers = 1, 2, 3, 4;for (Integer i : integers) System.out.println(i);/* 依次输
5、出“1”、 “2”、 “3”、 “4” */注意,这里说的“元素的类型”,是由要被遍历的对象的决定的?D?D 如果它是一个Object型的数组,那么元素的类型就是 Object,即使里面装的都是 String 对象也是如此。可以限定元素类型的 Collection截至到 J2SE 1.4 为止,始终无法在 Java 程序里限定 Collection 中所能保存的对象的类型?D?D 它们全部被看成是最一般的 Object 对象。一直到 J2SE 1.5 中,引入了“ 泛型(Generics) ”机制之后,这个问题才得到了解决。现在可以用 Collection来表示全部元素类型都是 T 的 Collection,如 Co