星期四, 2月 05, 2009

Java中的foreach

J2SE 5.0之後新增了foreach的語法, 可用於存取陣列元素. 以下為一些簡單的範例:

一維陣列

public class test02 {
    public static void main(String args[])
    {
        int[] a = new int[] {1, 2, 3, 4, 5};

        for(int v : a)
            System.out.println(v);
    }
}

二維陣列

public class test02 {
    public static void main(String args[])
    {
        int[][] a = new int[][] {
            {1, 2, 3, 4, 5},
            {10, 11, 12}
        };

        for(int[] row : a) {
            for(int element : row)
                System.out.print(element + " ");
            System.out.println();
        }
    }
}

Autoboxing in Java

自動boxing/unboxing是J2SE 5.0之後提供的新功能, 可以由compiler視程式需要自動在primitive data type以及object之間進行轉換. Boxing就是將primitive data type轉成object, 而unboxing則是把object轉成對應的primitive data type. 如下範例所示:

public class test02 {
    public static void main(String args[])
    {
        Integer i1;
        int a = 100;

        i1 = new Integer(a); // boxing
        i1 = a/2; // auto boxing

        a = i1.intValue()/5; // unboxing
        a = i1/2; // auto unboxing
    }
}

雖然這功能非常方便, 但是有幾點是必須要注意的. 首先, 因為這動作是compiler time的動作, 所以有可能會發生程式可以成功編譯但是執行時卻發生執行錯誤的現象. 例如:

public class test02 {
    public static void main(String args[])
    {
        Integer i = null;
        int a;

        a = i / 2; // null pointer exception
    }
}

另外, 數值大小不同也會使boxing的行為有些不同, 例如:

public class test02 {
    public static void main(String args[])
    {
        Integer i = 100;
        Integer j = 100;

        if(i == j)
            System.out.println("equal");
        else
            System.out.println("not equal");
    }
}

此程式會得到equal. 但是下一個範例則會得到not equal.

public class test02 {
    public static void main(String args[])
    {
        Integer i = 200;
        Integer j = 200;

        if(i == j)
            System.out.println("equal");
        else
            System.out.println("not equal");
    }
}

這兩個範例唯一的差別在於程式中所指定的數值, 一個為100, 另一個為200, 但是結果卻也不同. 這是因為auto boxing 在數值介於-128到127之間時, 記憶體會重複使用, 所以第一個範例的i與j會是相同的物件. 反之, 第二個範例則會是兩個不同的物件, 所以兩支程式的執行結果也就不一樣.