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中,當我們定義:
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多維陣列的遍歷Java陣列
- JavaScript遍歷陣列詳解JavaScript陣列
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- jquery裡遍歷普通陣列和多維陣列的方法及例項jQuery陣列
- java陣列遍歷的方法Java陣列
- 陣列記憶體地址解讀及二維陣列的遍歷陣列記憶體
- 23:二維陣列回形遍歷陣列
- 21:二維陣列右上左下遍歷陣列
- 陣列遍歷陣列
- 陣列遍歷方法陣列
- 遍歷陣列物件陣列物件
- java陣列如何遍歷全部的元素Java陣列
- c++遍歷陣列的多種方式C++陣列
- PHP二維關聯陣列的遍歷方式PHP陣列
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- js 遍歷陣列方式JS陣列
- php陣列中常用的多種遍歷方式PHP陣列
- $.each()方法遍歷二維陣列程式碼例項陣列
- **PHP二維陣列遍歷時同時賦值PHP陣列賦值
- php中使用while遍歷二維陣列的方法PHPWhile陣列
- 陣列的三種宣告方式總結、多維陣列的遍歷、Arrays類的常用方法總結陣列
- 物件和陣列的遍歷物件陣列
- php陣列迴圈遍歷PHP陣列
- Java基礎(四)——switch語句、一維陣列、二維陣列的定義、儲存、遍歷、常見問題Java陣列
- JS陣列遍歷和獲取陣列最值JS陣列
- php手冊 php陣列的遍歷有哪幾種方式?php陣列如何遍歷?PHP陣列
- 多維陣列陣列
- php 陣列遍歷奇怪現象PHP陣列
- 遍歷陣列的幾種方法陣列
- Html遍歷物件、list集合、陣列HTML物件陣列
- Jvascript陣列迭代,遍歷的方法陣列
- 陣列常見的遍歷迴圈方法、陣列的迴圈遍歷的效率對比陣列
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 一維多維陣列陣列
- PHP中二維陣列與多維陣列PHP陣列
- php如何遍歷多維的stdClassObject物件,php的轉換成陣列的函式只能轉換外面一叢陣列PHPObject物件陣列函式
- 有關js各種陣列遍歷JS陣列
- php陣列原理遍歷原理揭祕PHP陣列