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。