FAQ2.25 如何实现一维和二维数组的遍历?
答:
在Java程序中,我们有时要逐一处理某些对象,比如数组或Collection类型的元素,这种操作一般称为遍历。
传统的遍历形式如下:
a.PNG (14.64 KB)
2008-3-5 16:01
我们的目标:增强的for循环
在J2SE 1.5中,引入了另一种形式的for循环。借助这种形式的for循环,现在可以用一种更简单的方式来进行遍历。
我们来看一看语法结构:
for(type element : array) {
System.out.println(element)
}
type 集合(不仅仅指Collection,也包含普通的数组)中元素的数据类型
element 遍历到的元素
array 集合对象本身(当然不只是Collection)
现在我们改写一下代码
b.PNG (11.07 KB)
2008-3-5 16:01
第二个疑问:是否可以改循环变量的值?
当然可以,但是并不改变原先集合的值。大家看以下的范例。
c.PNG (4.97 KB)
2008-3-5 16:01
运行结果:
10
10
10
10
10
1
2
3
4
5
这是因为,增强的for循环,在编译期间被看成类似以下形式:
int[] a= {1,2,3,4,5};
for (int i,int 临时变量名 = 0; 临时变量名 < a.length; 临时变量名++) {
i =a[临时变量名]
System.out.println(变量名甲);
}
//i只是集合元素的副本
//如果有疑问,使用continue和break测试一下。用传统的for循环套路测试!
对集合的迭代也一样。
在编译期间,J2SE 1.5的编译器会把新形式的for循环,看成是对应的传统形式,所以不必担心出现性能方面的问题。
第三个疑问:新的for循环是否可以完全取代老的for循环形式?
不能,新的for循环只用来遍历。如果只希望遍历部分集合,也必须用老的for循环形式。
第四个疑问:使用条件是不是数组或者Collection接口以及其子接口实现类。
不是。Collection有一个父接口java.lang.Iterable。使用条件是,数组或者Iterable接口和子接口实现类
和泛型一起使用
泛型(Generic)是jdk1.5新加的技术,和c++的模块有相对应的技术。泛型方法对应函数模板,泛型类对应模板类。语法上非常类似。但运行机制相差很远,使用目的差别更远。Java泛型的目的是对象限制类型,以使java语言变得类型安全。
不多说了,大家来看使用泛型改写的第二个遍历。
本处没有给出第一个遍历的改写是因为基本类型不适用于泛型。泛型也不能声明参数化类型的数组。