JAVA多維陣列的遍歷

helloKingshan發表於2016-04-06

  陣列是程式語言中最常見的一種資料結構,可用於儲存多個資料,每個陣列元素存放一個資料,通常可通過陣列元素的索引來訪問陣列元素。

一旦陣列初始化完成,陣列在記憶體中所佔用的空間將被固定下來,因此陣列的長度將不可改變。

1定義陣列

Java支援兩種語法格式來定義陣列

type [] arrayName;
type arrayName [];

通常推薦第一種格式。
2陣列的初始化

(1)靜態初始化

顯式指定陣列每一個元素初始值,由系統決定陣列長度。

arrayName = new type[] { 1,2,3....}

(2)動態初始化

只指定陣列長度,由系統為陣列元素分配初始值。

arrayName = new type[length];
3陣列的使用

所有的陣列都提供了一個length屬性,通過這個屬性可以訪問到陣列的長度。所以我們可以通過for迴圈來逐一遍歷陣列元素

for( int i =0; i<arrayName.length; i++)
{
Syetem.out.printf("arrayName[i]");
}
4foreach迴圈

java5之後,java提供了一種更為簡單的迴圈,無需根據索引來訪問陣列元素,foreach迴圈自動遍歷陣列和集合的每個元素。

foreach迴圈的語法格式如下:

for( type variableName : array | collection)
{
  //自動迭代訪問每個元素。。。
}

下面程式示範瞭如何使用foreach

public class ForEachTest
{
public static void main (String [] args)
{
string[] books = {"1","2","3"};
for( String book : books)
{
System.out.println(book);
}
}
}

上面的程式碼是一維陣列的例子。換句話說,陣列長度只能在一個方向上增長。很多時候我們需要陣列在多個維度上增長。這種陣列我們稱之為多維陣列。為簡單起見,我們將它稱為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];
	}
}
然而  在java中並沒有二維陣列,其實,當你定義一個二維陣列的時候 ,其實就是定義了一個一維陣列的陣列。這意味著,在上面的例子中,二維陣列是一個陣列的引用,其每一個元素都是另一個int陣列的引用。

不同的遍歷方式對效能的影響非常大  比如看下面的例子

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;
            }
        }
    }
}

一行一行的遍歷要比列遍歷快得多。




相關文章