The comma operator(逗号运算符)
逗号运算符(不是逗号分隔符,它用在分隔变量的定义和方法的参数)在Java中has only one use:在for循环的控制表达式中,在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句。而且那些语句均会独立执行。下面看一个例子:
1-1 逗号运算符的例子
//: control/CommaOperator.java public class CommaOperator { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { System.out.println("i = " + i + " j = " + j); } } }
程序运行的结果如下:
注意:
变量的初始化部分虽然可以定义不同的变量,但是变量的类型必须是一样的,在上述代码中
int i = 1, j = i + 10;
即变量i、j均为int类型。
这样的方式只能在for循环中使用,在其他的选择与循环中不能这样使用。
Foreach syntax(foreach语句)
foreach语句是JDK5中的新语法,主要是方便数组(arrays)和容器(containers)的操作,原因是:在循环中你不在需要自己定义一个循环计数的变量,foreach语句自动地帮你遍历每一项。
1-2 foreach语句的例子
//: control/ForEachFloat.java import java.util.*; public class ForEachFloat { public static void main(String[] args) { Random rand = new Random(47); float f[] = new float[10]; for(int i = 0; i < 10; i++) f[i] = rand.nextFloat(); for(float x : f) System.out.println(x); } }
程序执行的结果如下:
注意:
数组的初始化利用正常形式的for循环,因为必须利用下标给出的地址给内存单元赋初值。
语句
for(float x : f)
是指定义一个float类型的变量x,将数组f中的元素循环赋值给x
任何返回数组类型的方法都可以利用foreach实现,比如,String类有一个toCharArray()方法,其返回一个char类型的数组,因此可以利用foreach很简单的迭代字符串的每一项。
1-3 foreach迭代字符串的每一项
//: control/ForEachString.java public class ForEachString { public static void main(String[] args) { for(char c : "An African Swallow".toCharArray() ) System.out.print(c + " "); } }
程序运行的结果如下:
foreach同样适用于任何Iterable类型的对象。
在许多涉及到逐步操作整型类型的数列中,像下面这样的语句
for(int i = 0; i < 100; i++)
这些情况下,除非首先已定义好一个int类型的数组,否则foreach是无能为力的。这个时候时候要简化上面for语句的操作就得另外想办法了。
1-4 利用自己创建的类简化普通for语句的操作的例子
//: control/ForEachInt.java import static net.mindview.util.Range.*; import static net.mindview.util.Print.*; public class ForEachInt { public static void main(String[] args) { for(int i : range(10)) // 0..9 printnb(i + " "); print(); for(int i : range(5, 10)) // 5..9 printnb(i + " "); print(); for(int i : range(5, 20, 3)) // 5..20 step 3 printnb(i + " "); print(); } }
程序运行的结果如下:
注意:
import static net.mindview.util.Range.*;
就是导入自己写好的方法
range(
),其完整代码如下:
//: net/mindview/util/Range.java // Array creation methods that can be used without // qualifiers, using Java SE5 static imports: package net.mindview.util; public class Range { // Produce a sequence [0..n) public static int[] range(int n) { int[] result = new int[n]; for(int i = 0; i < n; i++) result[i] = i; return result; } // Produce a sequence [start..end) public static int[] range(int start, int end) { int sz = end - start; int[] result = new int[sz]; for(int i = 0; i < sz; i++) result[i] = start + i; return result; } // Produce a sequence [start..end) incrementing by step public static int[] range(int start, int end, int step) { int sz = (end - start)/step; int[] result = new int[sz]; for(int i = 0; i < sz; i++) result[i] = start + (i * step); return result; } }
range()可以使用在大多的场合。
foreach语句不仅简化了for语句(敲更少的代码),更重要的是它的可读性更好,直接告诉你操作的目的(得到数组的每一个元素),而不用给出怎么做的细节(for循环中创建下标,在以后的操作中依靠此来选择数组中的每一个元素)。