posts - 8,  comments - 6,  trackbacks - 0

1.1  在Java中没有for:使用增强的for循环 

Java5+

在一些编程语言中,通过列表或数组可以非常方便地进行遍历,通过一个循环即可逐个遍历项并将该项赋值一个局部变量从而实现自动循环。我曾经告诉过一个同事我认为Java中的“for”循环功能是不完全的,因为它没有“for-each”。我的朋友也是一个有经验的Java开发人员,他的回答是“你疯了吗?,在Java中当然有for!”在此之后很长一段时间里他为此而不断地嘲笑我,并定期地提醒我在Java中存在for(为了防止我遗忘此事) 。但是我有一个好消息要告诉他和所有Java开发人员:目前在Java中有了真正的for!

考虑这样一种情况,你希望对一个整型对象集合(如java.util.ArrayList)中的所有数值求和。你很可能编写过类似于下面这样的代码:

ArrayList theList = new ArrayList();
theList.add(new Integer(2));
theList.add(new Integer(3));
theList.add(new Integer(5));
theList.add(new Integer(7));
int sum = 0;
// The old way to iterate
for (Iterator iter = theList.iterator(); iter.hasNext(); ) {
Integer x = (Integer) iter.next();
sum = sum + x.intValue();
}
System.out.println("The sum is " + sum);

这段代码多麻烦啊,难道编译器不应该知道你正在进行迭代吗?毕竟这是一个for循环,不是吗?而在Java 5中,增强的for循环现已支持集合对象。因此不再需要使用迭代器。在下面的修订的代码中,一个for循环通过列表进行迭代并显示出每个值:

ArrayList<Integer> theList = new ArrayList<Integer>();
theList.add(2);
theList.add(3);
theList.add(5);
theList.add(7);
int sum = 0;
// new Java 5 iteration syntax
for (Integer item : theList) {
sum = sum + item;
}
System.out.println("The sum is " + sum);

for循环定义了一个叫做item的局部变量,在每次迭代过程中,它将得到列表中的下一个值。除了完美的for循环语法外,此代码在以下两个方面也不同于过去的Java代码。

使用了泛型

上面带有尖括号的语法是Java 5新增加的泛型特性。泛型允许为一些具体类型的对象定义类,但是直到创建该类的一个实例时才能知道具体的类型。编译器将会强迫执行类型检查。在这个示例中,ArrayList是一个特殊的类,对于add方法它只接受整数(并只从它的Iterator的next方法中返回整数)。这意味着当从列表中检索对象时不需要强制类型转换,可以立即将它们作为Integer实例来对待。不使用泛型时,仍可以使用新的for循环语法,但需要将Object强制转换成Integer。在1.4节中将我们更详细地介绍泛型。

整型对象到整型数值的自动转换

在Java 5中,可以将Integer对象作为int来对待。编译器将自动执行从int到Integer对象的转换(反之亦然),此过程称为自动装箱(autoboxing)。当循环中得到一个Integer对象时,可以将它与一个int值相加而不需要执行显式的转换。
新的for语言也适用于数组:

int[] theList = new int[] {2,3,5,7};
int sum = 0;
for (int x : theList) {
sum = sum + x;
}
System.out.println("The sum is " + sum);
这种新的语法的确使代码变得更加易读和紧凑。但还不能完全放弃迭代器,至少暂时是这样,因为还有很多开发人员没有将他们的JDK升级到版本5。


只有注册用户登录后才能发表评论。


网站导航:
 

<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜