從零開始學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. 第一題

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