第2章 Java编程基础——FAQ2.25 如何实现一维和二维数组的遍历?
FAQ2.25 如何实现一维和二维数组的遍历?
答:
在Java程序中,我们有时要逐一处理某些对象,比如数组或Collection类型的元素,这种操作一般称为遍历。
传统的遍历形式如下:
a.PNG (14.64 KB)
2008-3-5 16:01
本范例使用jdk1.6编写,所以使用了jdk的注释,否则使用支持泛型的集合类时会报警告。
@SuppressWarings(“某一种警告”)
我们的目标:增强的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
第一个疑问:为什么不是foreach …in…结构
看到这里,博学的程序员会产生一些联想,语法为什么不是foreach循环结构?起码foreach结构,意义更明确一些。为什么没有in?至少 foreach (元素 in 集合)更符号英语语法的习惯。
JSP程序员也会想到JSTL中包含了<c:foreach/>标签。
其实java语言有自己的苦衷,是为了避免因为引入新的关键字,造成兼容性方面的问题——在Java语言中,不允许把关键字当作变量名来使用。
虽然使用“foreach”的情况并不是非常多,但是“in”却被经常用来表示输入流的名字(例如java.lang.System类里,就有一个名字叫做“in”的static属性,表示“标准输入流”)。
在第2部分中,我们会探讨java增强for循环的内在机制,使用条件,并且把这种形式和java泛型一起使用以得到全新编程的体验。
=========================================================================================================================
高级部分:
第二个疑问:是否可以改循环变量的值?
当然可以,但是并不改变原先集合的值。大家看以下的范例。
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语言变得类型安全。
不多说了,大家来看使用泛型改写的第二个遍历。
本处没有给出第一个遍历的改写是因为基本类型不适用于泛型。泛型也不能声明参数化类型的数组。