1.5 不规则数组
通過前面的學習我們知道 Java 實際上沒有多維數組,只有一維數組。多維數組被解釋為是數組的數組,所以因此會衍生出一種不規則數組。
規則的 4×3 二維數組有 12 個元素,而不規則數組就不一定了。如下代碼靜態初始化了一個不規則數組。
int intArray[][] = {{1,2}, {11}, {21,22,23}, {31,32,33}};高維數組(二維以及二維以上的數組稱為高維數組)是 4 個元素,但是低維數組元素個數不同,如圖 1 所示,其中第 1 個數組有兩個元素,第 2 個數組有 1 個元素,第 3 個數組有 3 個元素,第 4 個數組有 3 個元素。這就是不規則數組。
動態初始化不規則數組比較麻煩,不能使用 new int[4][3] 語句,而是先初始化高維數組,然后再分別逐個初始化低維數組。代碼如下:
從上述代碼初始化數組完成之后,不是有 12 個元素而是 9 個元素,它們的下標索引如圖 2 所示,可見其中下標 [0][2]、[1][1] 和 [1][2] 是不存在的,如果試圖訪問它們則會拋出下標越界異常。
提示:下標越界異常(ArrayIndexOutOfBoundsException)是試圖訪問不存在的下標時引發的。例如一個一維 array 數組如果有 10 個元素,那么表達式 array[10] 就會發生下標越界異常,這是因為數組下標是從 0 開始的,最后一個元素下標是數組長度減 1,所以 array[10] 訪問的元素是不存在的。
下面介紹一個不規則數組的示例:
import java.util.Arrays; public class HelloWorld {public static void main(String[] args) {int intArray[][] = new int[4][]; // 先初始化高維數組為4// 逐一初始化低維數組intArray[0] = new int[2];intArray[1] = new int[1];intArray[2] = new int[3];intArray[3] = new int[3];// for循環遍歷for (int i = 0; i < intArray.length; i++) {for (int j = 0; j < intArray[i].length; j++) {intArray[i][j] = i + j;}}// for-each循環遍歷for (int[] row : intArray) {for (int column : row) {System.out.print(column);// 在元素之間添加制表符,System.out.print('\t');}// 一行元素打印完成后換行System.out.println();}System.out.println(intArray[0][2]); // 發生運行期錯誤} }不規則數組訪問和遍歷可以使用 for 和 for-each 循環,但要注意下標越界異常發生。
上述代碼第 18 行和第 19 行采用 for-each 循環遍歷不規則數組,其中代碼第 18 行 for-each 循環取出的數據是 int 數組,所以 row 類型是 int[]。代碼第 19 行 for-each 循環取出的數據是 int 數據,所以 column 的類型 int。另外,注意代碼第 27 行試圖訪問 intArray[0][2]元素,由于 [0][2] 不存在所以會發生下標越界異常。
總結
- 上一篇: 1.4 多维数组
- 下一篇: 1.6 Java数组也是一种数据类型