你是否闭着眼睛也能写出这些代码:
//
遍历数组
for ( int i = 0 ; i < array.length; i ++ ) ... {
int n = array[i];
//do something
}
// 遍历集合
for (Interator iter = list.iterator(); iter.hasNext(); ) ... {
Object o = iter.next();
//do something
}
for ( int i = 0 ; i < array.length; i ++ ) ... {
int n = array[i];
//do something
}
// 遍历集合
for (Interator iter = list.iterator(); iter.hasNext(); ) ... {
Object o = iter.next();
//do something
}
一遍一遍地重复书写这样的代码是不是让你的大脑和手指都磨出了茧子?
The shorter the better!在不影响程序可读性的情况下,写出更精简的代码才是“王道”。鉴于数组或集合的遍历操作被使用的频率相当地高,在Java 5.0中,推出了增强的for循环,即for/in (for each)循环。鄙人在得知此种for循环语法之后,如牛得草,故将一点经验与广大Java初学者分享。
一、遍历数组
语法为:
for
(Type value : array) {
expression value;
}
expression value;
}
//
以前我们这样写:
void someFunction () ... {
int[] array = ...{1,2,5,8,9};
int total = 0;
for (int i = 0; i < array.length; i++) ...{
total += array[i];
}
System.out.println(total);
}
// 现在我们只需这样写(和以上写法是等价的):
void someFunction () ... {
int[] array = ...{1,2,5,8,9};
int total = 0;
for (int n : array) ...{
total += n;
}
System.out.println(total);
}
void someFunction () ... {
int[] array = ...{1,2,5,8,9};
int total = 0;
for (int i = 0; i < array.length; i++) ...{
total += array[i];
}
System.out.println(total);
}
// 现在我们只需这样写(和以上写法是等价的):
void someFunction () ... {
int[] array = ...{1,2,5,8,9};
int total = 0;
for (int n : array) ...{
total += n;
}
System.out.println(total);
}
这种写法的缺点:
显而易见,for/in(for each)循环自动控制一次遍历数组中的每一个元素,然后将它赋值给一个临时变量(如上述代码中的int n),然后在循环体中可直接对此临时变量进行操作。这种循环的缺点是:
1. 只能顺次遍历所有元素,无法实现较为复杂的循环,如在某些条件下需要后退到之前遍历过的某个元素;
2. 循环变量(i)不可见,如果想知道当前遍历到数组的第几个元素,只能这样写:
int
i
=
0
;
for ( int n : array) ... {
System.out.println(“This ” + i + “-th element in the array is ” + n);
}
for ( int n : array) ... {
System.out.println(“This ” + i + “-th element in the array is ” + n);
}
二、遍历集合
语法为:
for
(Type value : Iterable)
...
{
expression value;
}
expression value;
}
注意:for/in循环遍历的集合必须是实现Iterable接口的。
//
以前我们这样写:
void someFunction () ... {
List list = new ArrayList();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Iterator iter = list.iterator(); iter.hasNext();) ...{
String temp= (String) iter.next();
s += temp;
}
System.out.println(s);
}
// 现在我们这样写:
void someFunction () ... {
List list = new ArrayList();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Object o : list) ...{
String temp = (String) o;
s += temp;
}
System.out.println(s);
}
// 如果结合“泛型”,那么写法会更简单,如下:
void someFunction () ... {
List<String> list = new ArrayList<String>();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (String temp : list) ...{
s += temp; //省去了对强制类型转换步骤
}
System.out.println(s);
}
// 上述代码会被编译器转化为:
void someFunction () ... {
List<String> list = new ArrayList<String>();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) ...{
String temp = iter.next();
s += temp;
}
System.out.println(s);
}
void someFunction () ... {
List list = new ArrayList();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Iterator iter = list.iterator(); iter.hasNext();) ...{
String temp= (String) iter.next();
s += temp;
}
System.out.println(s);
}
// 现在我们这样写:
void someFunction () ... {
List list = new ArrayList();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Object o : list) ...{
String temp = (String) o;
s += temp;
}
System.out.println(s);
}
// 如果结合“泛型”,那么写法会更简单,如下:
void someFunction () ... {
List<String> list = new ArrayList<String>();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (String temp : list) ...{
s += temp; //省去了对强制类型转换步骤
}
System.out.println(s);
}
// 上述代码会被编译器转化为:
void someFunction () ... {
List<String> list = new ArrayList<String>();
list.add("Hello ");
list.add("Java ");
list.add("World!");
String s = "";
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) ...{
String temp = iter.next();
s += temp;
}
System.out.println(s);
}
这种写法的缺点:
虽然对集合进行的for/in操作会被编译器转化为Iterator操作,但是使用for/in时,Iterator是不可见的,所以如果需要调用Iterator.remove()方法,或其他一些操作, for/in循环就有些力不从心了。
综上所述,Java 5.0中提供的增强的for循环——for/in(for each)循环能让我们的代码更加简洁,让程序员使用时更加方便,但是也有它的局限性,所以一定要根据实际需要有选择性地使用,不要盲目追求所谓的“新特性”。