從零開始學Java之複雜的二維陣列如何正確使用

語言: CN / TW / HK

theme: healer-readable

作者:孫玉昌,暱稱【一一哥】,另外【壹壹哥】也是我哦

CSDN部落格專家、萬粉博主、阿里雲專家博主、掘金優質作者

前言

在前幾篇文章中,壹哥給大家介紹了Java裡的一維陣列,涉及到了陣列的建立初始化、陣列遍歷、拷貝、擴容、排序、查詢等核心內容,這些內容都是陣列中的重點,壹哥希望大家要在這些知識點上多付出點時間和精力。但是我們知道,除了有一維陣列之外,還有二維陣列和多維陣列,這些內容同樣很重要。所以今天壹哥就在一維陣列的基礎上,繼續給大家講解多維陣列的內容。

------------------------------前戲已做完,精彩即開始----------------------------

全文大約【3000】 字,不說廢話,只講可以讓你學到技術、明白原理的純乾貨!本文帶有豐富案例及配圖視訊,讓你更好地理解和運用文中的技術概念,並可以給你帶來具有足夠啟迪的思考......

一. 多維陣列

1. 概念

多維陣列可以看成是陣列的陣列。 比如二維陣列就是一個特殊的一維陣列,它的每個元素都是一個一維陣列。其他多維陣列的概念,大家可以參照二維陣列以此類推。

2. 分類

多維陣列可以分為:

  • 二維陣列;
  • 三維陣列;
  • 其他陣列;

其實我們在開發時,真正常用的陣列也就是一維陣列和二維陣列,更多維度的陣列很少使用。所以接下來在本篇文章中,壹哥主要是給大家講解二維陣列相關的內容。

二. 二維陣列

1. 概念

二維陣列就是一種陣列的陣列,其本質上還是一個一維陣列,只是它的資料元素又是一個一維陣列。 如果你對這個概念想象不出來,壹哥給大家舉個栗子,相信吸菸的同學一下子就會明白。

一根菸 = 一個變數

一包煙 = 20根菸 = 一維陣列

一條煙 = 10包煙 = 二維陣列

也就是說,我們買的”一條煙“,就是一種”二維陣列“,明白了吧?

2. 定義

定義二維陣列的基本語法如下:

定義方式一:

元素型別[][] 陣列名稱;

定義方式二:

元素型別 陣列名稱[][];

在開發時,第一種定義方式更常用一些。這是陣列的定義,我們還要對陣列進行初始化。二維陣列在初始化時,也分為動態初始化和靜態初始化兩種情況。我們可以把陣列的定義和初始化在多條語句中分開完成,也可以直接放在一個語句中完成。

3. 初始化

3.1 動態初始化

二維陣列進行動態初始化時,語法格式如下:

元素型別[][] 陣列名稱 = new 元素型別[二維陣列的長度][一維陣列的長度];


例如:

int[][] arr = new int[3][4];

在上述示例中,表示我們定義了一個整型的二維陣列arr。3表示在二維陣列中有3個一維陣列,每個一維陣列就是一行;4表示每個一維陣列中有4個數據元素,這樣就形成了二維陣列的4列。 這樣我們就可以把這個二維陣列arr看成是一個3行4列的陣列或矩陣, 訪問二維陣列中的某個元素時,需要使用arr[row][col]的形式。所以二維陣列中,總的元素個數最多有3*4=12個。

以下是動態初始化的案例程式碼。

``` /* * @author 一一哥Sun / public class Demo15 { public static void main(String[] args) { // 二維陣列--動態初始化

//二維陣列在動態初始化時,必須指定二維陣列的長度。
    //建立一個包含了3個一維陣列的二維陣列,每個一維陣列的長度是2。
    int[][] arr2 = new int[3][2];

    //給二維陣列賦值
    //給二維陣列中的第一個一維陣列賦值
    arr2[0][0] = 111;
    arr2[0][1] = 222;

    //給二維陣列中的第二個一維陣列賦值
    arr2[1][0] = 333;
    arr2[1][1] = 444;

    //給二維陣列中的第三個一維陣列賦值
    arr2[2][0] = 555;
    arr2[2][1] = 666;

    //二維陣列取值
    System.out.println( "二維陣列中第一個元素裡的第一個元素"+arr2[0][0]);
    System.out.println( "二維陣列中第一個元素裡的第二個元素"+arr2[0][1]);
    System.out.println( "二維陣列中第二個元素裡的第一個元素"+arr2[1][0]);
    System.out.println( "二維陣列中第二個元素裡的第二個元素"+arr2[1][1]);

    //獲取二維陣列的長度
    System.out.println("二維陣列的長度"+arr2.length);
    System.out.println("二維陣列中第一個一維陣列的長度"+arr2[0].length);
    System.out.println("二維陣列中第二個一維陣列的長度"+arr2[1].length);
    System.out.println("二維陣列中第三個一維陣列的長度"+arr2[2].length);
}

} ```

注意:我們在對二維陣列進行動態初始化時,必須先指定出二維陣列的長度,但一維陣列的長度可以後續使用前再單獨指定。

3.2 靜態初始化

二維陣列中,每個一維陣列的長度並不要求相同,可以各不相同。 二維陣列進行靜態初始化時,語法格式如下:

元素型別[][] 陣列名稱 = new 元素型別[][]{{一維陣列1,一維陣列2,一維陣列3....};

例如:

int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};

但是這種方式的語法顯得有些囉嗦,所以在實際開發時,我們一般是採用簡化的靜態初始化方式,如下所示:

元素型別[][] 陣列名稱 =m{{一維陣列1,一維陣列2,一維陣列3....};

例如:

int[][] arr = {{2,3},{5,2,1},{10,45,22,54}};

以下是靜態初始化的案例程式碼。

``` /* * @author 一一哥Sun / public class Demo16 { public static void main(String[] args) { // 二維陣列--靜態初始化

//靜態初始化一個二維陣列。靜態初始化時可以很靈活
int[][] arr = {{11,22,33},{66,88}};

    //給二維陣列賦值。
    //重新給二維陣列中第一個一維數組裡的第3個數據元素(即33)賦值,用99替換原來的33.
    arr[0][2] = 99;
    //重新給二維陣列中第二個一維數組裡的第1個數據元素(即66)賦值,用77替換原來的66.
    arr[1][0] = 77;

    //二維陣列取值
    System.out.println( "二維陣列中第一個一維數組裡的第一個元素"+arr[0][0]);
    System.out.println( "二維陣列中第一個一維數組裡的第二個元素"+arr[0][1]);
    System.out.println( "二維陣列中第二個一維數組裡的第三個元素"+arr[0][2]);
    System.out.println( "二維陣列中第二個一維數組裡的第一個元素"+arr[1][0]);
    System.out.println( "二維陣列中第二個一維數組裡的第二個元素"+arr[1][1]);

    //獲取二維陣列的長度
    System.out.println("二維陣列中的長度"+arr.length);
    System.out.println("二維陣列中第一個一維陣列的長度"+arr[0].length);
    System.out.println("二維陣列中第二個一維陣列的長度"+arr[1].length);
}

} ```

以上是定義和初始化二維陣列的基本案例,為了加深大家對二維陣列的理解,接下來壹哥再設計幾個程式碼案例,鞏固二維陣列的用法。

4. 擴充套件案例

4.1 動態初始化的變形寫法

如果我們在定義二維陣列時,沒有給定一維陣列的長度,那麼在使用陣列之前,一定要先對一維陣列進行初始化。 否則,此時如果直接使用一維陣列,就會產生空指標異常java.lang.NullPointerException。

``` /* * @author 一一哥Sun / public class Demo17 { public static void main(String[] args) { //動態初始化時未限定一維陣列的長度 int[][] arr = new int[3][];

//如果我們在定義二維陣列時,沒有給定一維陣列的長度,那麼在使用陣列之前,一定要初始化裡面的一維陣列。
//否則,如果直接使用一維陣列,就會產生空指標異常java.lang.NullPointerException
// arr3[0][0] = 100;
//初始化一維陣列
arr[0] = new int[2];
arr[1] = new int[1];
arr[2] = new int[4];

//給陣列賦值
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 10;
arr[2][0] = 100;
arr[2][1] = 200;
arr[2][2] = 300;
arr[2][3] = 400;

// 二維陣列取值
System.out.println("二維陣列中的第一個元素中的第一個元素" + arr[0][0]);
System.out.println("二維陣列中的第一個元素中的第二個元素" + arr[0][1]);
System.out.println("二維陣列中的第二個元素中的第一個元素" + arr[1][0]);
}

} ```

arr[0]=new int[2] 和 arr [1]=new int[1]是在為最高維分配引用空間,也就是限制了最高維能儲存資料的最大長度。

4.2 遍歷二維陣列

因為二維陣列中包含若干個一維陣列,我們之前遍歷一維陣列時要使用一個迴圈,所以我們對二維陣列進行遍歷時就要使用巢狀的雙重迴圈。當然,for/while/foreach等迴圈都可以使用。

``` /* * @author 一一哥Sun / public class Demo18 { public static void main(String[] args) { // 二維陣列--遍歷 //定義一個二維陣列 int[][] arr = {{11,22,33},{55,66},{77,88,99}};

    //使用雙重for迴圈,遍歷二維陣列
    //第一層迴圈:遍歷二維陣列中有幾個一維陣列
    for (int i = 0; i < arr.length; i++) {
        //arr[i]是一維陣列
        //第二層迴圈:遍歷每個一維陣列
        for(int j = 0 ; j < arr[i].length ; j++) {
            System.out.println("二維陣列中第"+(i+1)+"個一維數組裡的元素"+arr[i][j]);
        }
    }
}

} ```

5. 記憶體分析

對於一個二維陣列來說,比如int[][] array={{10,0,0,20,0},{0,30,40,0,0},{0,0,0,0,0}};這個二維陣列的結構如下圖所示:

array[0]會獲取array陣列的第1個元素,因為array陣列的每個元素都是一個一維陣列,因此array[0]指向的陣列就是{ 10, 0, 0, 20, 0 },其他的以此類推。

高維陣列中的每個資料元素,儲存的是低位陣列的首地址。所以我們訪問array[0]就相當於是在訪問二維陣列中的第一個一維陣列的首地址,這樣就可以得到第一個一維陣列。

三. 多維陣列

理論上,在Java中我們可以定義出任意維度的陣列。但高於二維的多維陣列,在實際開發中很少使用,大家知道Java中支援這種資料結構即可。如果你感興趣,可以嘗試著自己構造一個三維陣列出來,壹哥就不在這裡過多講解啦,可以參考如下:

``` //動態初始化 int[][][] arr= new int[3][3][2];

//靜態初始化 int[][][] arr2= { { {1,2,3},{4,5,6},{7,8,9} }, { {1,2},{3,4} }, { {1,2},{3,4,5} } }; ```

------------------------------正片已結束,來根事後煙----------------------------

四. 結語

至此,壹哥就把二維陣列的內容給大家介紹完了,現在你知道如何使用二維陣列了嗎?二維陣列的定義、動態和靜態初始化、記憶體分析都是今天的重點,大家要牢牢掌握哦。

在下一篇文章中,壹哥會給大家講解Java裡的可變引數,敬請期待哦。另外如果你獨自學習覺得有很多困難,可以加入壹哥的學習互助群,我們一起交流學習。

五. 配套視訊

如果你不習慣閱讀技術文章,或是對文中的技術概念不能很好地理解,可以來看看壹哥幫你篩選出的視訊教程。與本文配套的Java學習視訊,連結如下:

https://player.bilibili.com/player.html?bvid=BV1Ja411x7XB&p=65&page=65

六. 今日作業

1. 第一題

利用二維陣列,打印出一個楊輝三角形來。