Java 多維數組遍歷詳解


數組是Java中的一種容器對象,它擁有多個單一類型的值。當數組被創建的時候數組長度就已經確定了。在創建之后,其長度是固定的。下面是一個長度為10的數組:

public class ArrayDemo {
	private int arraySize=10;
	public int[] arrayOfIntegers = new int[arraySize];
}

上面的代碼是一維數組的例子。換句話說,數組長度只能在一個方向上增長。很多時候我們需要數組在多個維度上增長。這種數組我們稱之為多維數組。為簡單起見,我們將它稱為2維數組。當我們需要一個矩陣或者X-Y坐標系的時候,二維數組是非常有用的。下面就是一個二維數組的例子:

public class TheProblemOf2DArray {
	private static final int ARR_SIZE=10;
	public static void main(String[] args) {
		int arr[][]=new int[ARR_SIZE][ARR_SIZE];
	}
}

想象一下,一個二維數組看起來就像一個X-Y坐標系的矩陣。

Java 多維數組遍歷

然而,可能讓Java開發者們感到驚訝的是,Java實際上並沒有二維數組。

在一個真正的數組中,所有的元素在內存中都存放在連續的內存塊中,但是在Java的二維數組並不是這樣。Java中所有一維數組中的元素占據了相鄰的內存位置,因此是一個真正的數組。

在Java中,當我們定義:

int singleElement // 表示一個int變量
int[] singleDArray // 表示一個int變量數組(一維)
int[][] twoDArray // 表示一個int變量數組的數組(二維)

這意味着,在上面的例子中,二維數組是一個數組的引用,其每一個元素都是另一個int數組的引用。

這張圖片清楚地解釋了這個概念。

由於二維數組分散在存儲器中,所以對性能有一些影響。為了分析這種差異,我寫了一個簡單的Java程序,顯示遍歷順序的重要性

package arrayTraverse;
/**
 * 二維數組的問題
 * 
 * 我們在初始化一個任意大小的2維數組。(為簡化分析我們使用二維方陣)我們將用兩種不同方式迭代同一個數組,分析結果
 * 兩種迭代方式的性能差距很大
 * @author mohit
 *
 */
public class TheProblemOf2DArray {
    //數組大小:數組越大,性能差距越明顯
    private static final int ARR_SIZE=9999;
    public static void main(String[] args) {
        //新數組
        int arr[][]=new int[ARR_SIZE][ARR_SIZE];
        long currTime=System.currentTimeMillis();
        colMajor(arr); 
        System.out.println("Total time in colMajor : "+(System.currentTimeMillis()-currTime)+" ms");
        //新數組,與arr完全相同
        int arr1[][]=new int[ARR_SIZE][ARR_SIZE];
        currTime=System.currentTimeMillis();
        rowMajor(arr1); // this is the only difference in above
        System.out.println("Total time in col : "+(System.currentTimeMillis()-currTime) +" ms");
    }

    /**
     * 下面的代碼按列優先遍歷數組
     * 即在掃描下一列之前先掃描完本列
     * 
     */
    private static void colMajor(int arr[][]) {
        for(int i=0;i<ARR_SIZE;i++){
            for (int j=0;j<ARR_SIZE;j++){
                //See this, we are traversing j first and then i
                arr[i][j]=i+j;
            }
        }
    }

    /**
     * 如果我們轉換內外循環
     * 程序就以行優先順序遍歷數組
     * 即在掃描下一行之前先掃描完本行
     * 這意味着我們訪問數組時每次都在訪問不同的列(因此也在訪問不同的頁)
     * 代碼微小的改變將導致這個程序花費更多的時間完成遍歷
     */
    private static void rowMajor(int arr[][]) {
        for(int i=0;i<ARR_SIZE;i++){
            for (int j=0;j<ARR_SIZE;j++){
            /*看這個,我們先遍歷j,然后遍歷i,但是對於訪問元素來說
             * 它們在更遠的位置,所以需要花費的更多
             */
            arr[j][i]=i+j;
            }
        }
    }
}

下面是示例的結果:

Java 多維數組遍歷

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM