Java 多维数组遍历
多維數組
數組是Java中的一種容器對象,它擁有多個單一類型的值。當數組被創建的時候數組長度就已經確定了。在創建之后,其長度是固定的。下面是一個長度為10的數組:
| 1 2 3 4 | public class ArrayDemo { ????private int arraySize=10; ????public int[] arrayOfIntegers = new int[arraySize]; } |
上面的代碼是一維數組的例子。換句話說,數組長度只能在一個方向上增長。很多時候我們需要數組在多個維度上增長。這種數組我們稱之為多維數組。為簡單起見,我們將它稱為2維數組。當我們需要一個矩陣或者X-Y坐標系的時候,二維數組是非常有用的。下面就是一個二維數組的例子:
| 1 2 3 4 5 6 | 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中,當我們定義:
| 1 2 3 | int singleElement // 表示一個int變量 int[] singleDArray // 表示一個int變量數組(一維) int[][] twoDArray // 表示一個int變量數組的數組(二維) |
這意味著,在上面的例子中,二維數組是一個數組的引用,其每一個元素都是另一個int數組的引用。
這張圖片清楚地解釋了這個概念。
由于二維數組分散在存儲器中,所以對性能有一些影響。為了分析這種差異,我寫了一個簡單的Java程序,顯示遍歷順序的重要性。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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; ????????????} ????????} ????} } |
下面是示例的結果:
重復上面的例子,它會始終給出類似的結果,不過時間差可能會有所不同。
原文鏈接:? dzone ?翻譯:? ImportNew.com? -? LynnShaw譯文鏈接:?http://www.importnew.com/16742.html
本文由?ImportNew?-?LynnShaw?翻譯自?dzone。
總結
以上是生活随笔為你收集整理的Java 多维数组遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java提高篇之数组(2)
- 下一篇: 数据库连接池浅析