第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语言变得类型安全。

不多说了,大家来看使用泛型改写的第二个遍历。
  本处没有给出第一个遍历的改写是因为基本类型不适用于泛型。泛型也不能声明参数化类型的数组。

posted @ 2010-01-18 11:07  2xd  阅读(1721)  评论(0编辑  收藏  举报