作者:孫玉昌,昵稱【一一哥】,另外【壹壹哥】也是我哦
千鋒教育高級(jí)教研員、CSDN博客專家、萬(wàn)粉博主、阿里云專家博主、掘金優(yōu)質(zhì)作者
前言
在前幾篇文章中,壹哥給大家介紹了Java里的一維數(shù)組,涉及到了數(shù)組的創(chuàng)建初始化、數(shù)組遍歷、拷貝、擴(kuò)容、排序、查找等核心內(nèi)容,這些內(nèi)容都是數(shù)組中的重點(diǎn),壹哥希望大家要在這些知識(shí)點(diǎn)上多付出點(diǎn)時(shí)間和精力。但是我們知道,除了有一維數(shù)組之外,還有二維數(shù)組和多維數(shù)組,這些內(nèi)容同樣很重要。所以今天壹哥就在一維數(shù)組的基礎(chǔ)上,繼續(xù)給大家講解多維數(shù)組的內(nèi)容。
--------------------------------------------------前戲已做完,精彩即開始----------------------------------------------
全文大約【3000】字,不說廢話,只講可以讓你學(xué)到技術(shù)、明白原理的純干貨!本文帶有豐富案例及配圖視頻,讓你更好地理解和運(yùn)用文中的技術(shù)概念,并可以給你帶來(lái)具有足夠啟迪的思考......
配套項(xiàng)目資料
Github:GitHub - SunLtd/LearnJava
Gitee:從零開始學(xué)Java
一. 多維數(shù)組
1. 概念
多維數(shù)組可以看成是數(shù)組的數(shù)組。比如二維數(shù)組就是一個(gè)特殊的一維數(shù)組,它的每個(gè)元素都是一個(gè)一維數(shù)組。其他多維數(shù)組的概念,大家可以參照二維數(shù)組以此類推。
2. 分類
多維數(shù)組可以分為:
- 二維數(shù)組;
- 三維數(shù)組;
- 其他數(shù)組;
其實(shí)我們?cè)陂_發(fā)時(shí),真正常用的數(shù)組也就是一維數(shù)組和二維數(shù)組,更多維度的數(shù)組很少使用。所以接下來(lái)在本篇文章中,壹哥主要是給大家講解二維數(shù)組相關(guān)的內(nèi)容。
二. 二維數(shù)組
1. 概念
二維數(shù)組就是一種數(shù)組的數(shù)組,其本質(zhì)上還是一個(gè)一維數(shù)組,只是它的數(shù)據(jù)元素又是一個(gè)一維數(shù)組。如果你對(duì)這個(gè)概念想象不出來(lái),壹哥給大家舉個(gè)栗子,相信吸煙的同學(xué)一下子就會(huì)明白。
一根煙 = 一個(gè)變量
一包煙 = 20根煙 = 一維數(shù)組
一條煙 = 10包煙 = 二維數(shù)組
也就是說,我們買的”一條煙“,就是一種”二維數(shù)組“,明白了吧?
2. 定義
定義二維數(shù)組的基本語(yǔ)法如下:
定義方式一:
元素類型[][] 數(shù)組名稱;
定義方式二:
元素類型 數(shù)組名稱[][];
在開發(fā)時(shí),第一種定義方式更常用一些。這是數(shù)組的定義,我們還要對(duì)數(shù)組進(jìn)行初始化。二維數(shù)組在初始化時(shí),也分為動(dòng)態(tài)初始化和靜態(tài)初始化兩種情況。我們可以把數(shù)組的定義和初始化在多條語(yǔ)句中分開完成,也可以直接放在一個(gè)語(yǔ)句中完成。
3. 初始化
3.1 動(dòng)態(tài)初始化
二維數(shù)組進(jìn)行動(dòng)態(tài)初始化時(shí),語(yǔ)法格式如下:
元素類型[][] 數(shù)組名稱 = new 元素類型[二維數(shù)組的長(zhǎng)度][一維數(shù)組的長(zhǎng)度];
例如:
int[][] arr = new int[3][4];
在上述示例中,表示我們定義了一個(gè)整型的二維數(shù)組arr。3表示在二維數(shù)組中有3個(gè)一維數(shù)組,每個(gè)一維數(shù)組就是一行;4表示每個(gè)一維數(shù)組中有4個(gè)數(shù)據(jù)元素,這樣就形成了二維數(shù)組的4列。這樣我們就可以把這個(gè)二維數(shù)組arr看成是一個(gè)3行4列的數(shù)組或矩陣,訪問二維數(shù)組中的某個(gè)元素時(shí),需要使用arr[row][col]的形式。所以二維數(shù)組中,總的元素個(gè)數(shù)最多有3*4=12個(gè)。
以下是動(dòng)態(tài)初始化的案例代碼。
/**
* @author 一一哥Sun
* QQ:2312119590
* CSDN、掘金、知乎找我哦
* 千鋒教育
*/
public class Demo15 {
public static void main(String[] args) {
// 二維數(shù)組--動(dòng)態(tài)初始化
//二維數(shù)組在動(dòng)態(tài)初始化時(shí),必須指定二維數(shù)組的長(zhǎng)度。
//創(chuàng)建一個(gè)包含了3個(gè)一維數(shù)組的二維數(shù)組,每個(gè)一維數(shù)組的長(zhǎng)度是2。
int[][] arr2 = new int[3][2];
//給二維數(shù)組賦值
//給二維數(shù)組中的第一個(gè)一維數(shù)組賦值
arr2[0][0] = 111;
arr2[0][1] = 222;
//給二維數(shù)組中的第二個(gè)一維數(shù)組賦值
arr2[1][0] = 333;
arr2[1][1] = 444;
//給二維數(shù)組中的第三個(gè)一維數(shù)組賦值
arr2[2][0] = 555;
arr2[2][1] = 666;
//二維數(shù)組取值
System.out.println( "二維數(shù)組中第一個(gè)元素里的第一個(gè)元素"+arr2[0][0]);
System.out.println( "二維數(shù)組中第一個(gè)元素里的第二個(gè)元素"+arr2[0][1]);
System.out.println( "二維數(shù)組中第二個(gè)元素里的第一個(gè)元素"+arr2[1][0]);
System.out.println( "二維數(shù)組中第二個(gè)元素里的第二個(gè)元素"+arr2[1][1]);
//獲取二維數(shù)組的長(zhǎng)度
System.out.println("二維數(shù)組的長(zhǎng)度"+arr2.length);
System.out.println("二維數(shù)組中第一個(gè)一維數(shù)組的長(zhǎng)度"+arr2[0].length);
System.out.println("二維數(shù)組中第二個(gè)一維數(shù)組的長(zhǎng)度"+arr2[1].length);
System.out.println("二維數(shù)組中第三個(gè)一維數(shù)組的長(zhǎng)度"+arr2[2].length);
}
}
注意:我們?cè)趯?duì)二維數(shù)組進(jìn)行動(dòng)態(tài)初始化時(shí),必須先指定出二維數(shù)組的長(zhǎng)度,但一維數(shù)組的長(zhǎng)度可以后續(xù)使用前再單獨(dú)指定。
3.2 靜態(tài)初始化
二維數(shù)組中,每個(gè)一維數(shù)組的長(zhǎng)度并不要求相同,可以各不相同。二維數(shù)組進(jìn)行靜態(tài)初始化時(shí),語(yǔ)法格式如下:
元素類型[][] 數(shù)組名稱 = new 元素類型[][]{{一維數(shù)組1,一維數(shù)組2,一維數(shù)組3....};
例如:
int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};
但是這種方式的語(yǔ)法顯得有些啰嗦,所以在實(shí)際開發(fā)時(shí),我們一般是采用簡(jiǎn)化的靜態(tài)初始化方式,如下所示:
元素類型[][] 數(shù)組名稱 =m{{一維數(shù)組1,一維數(shù)組2,一維數(shù)組3....};
例如:
int[][] arr = {{2,3},{5,2,1},{10,45,22,54}};
以下是靜態(tài)初始化的案例代碼。
/**
* @author 一一哥Sun
* QQ:2312119590
* CSDN、掘金、知乎找我哦
* 千鋒教育
*/
public class Demo16 {
public static void main(String[] args) {
// 二維數(shù)組--靜態(tài)初始化
//靜態(tài)初始化一個(gè)二維數(shù)組。靜態(tài)初始化時(shí)可以很靈活
int[][] arr = {{11,22,33},{66,88}};
//給二維數(shù)組賦值。
//重新給二維數(shù)組中第一個(gè)一維數(shù)組里的第3個(gè)數(shù)據(jù)元素(即33)賦值,用99替換原來(lái)的33.
arr[0][2] = 99;
//重新給二維數(shù)組中第二個(gè)一維數(shù)組里的第1個(gè)數(shù)據(jù)元素(即66)賦值,用77替換原來(lái)的66.
arr[1][0] = 77;
//二維數(shù)組取值
System.out.println( "二維數(shù)組中第一個(gè)一維數(shù)組里的第一個(gè)元素"+arr[0][0]);
System.out.println( "二維數(shù)組中第一個(gè)一維數(shù)組里的第二個(gè)元素"+arr[0][1]);
System.out.println( "二維數(shù)組中第二個(gè)一維數(shù)組里的第三個(gè)元素"+arr[0][2]);
System.out.println( "二維數(shù)組中第二個(gè)一維數(shù)組里的第一個(gè)元素"+arr[1][0]);
System.out.println( "二維數(shù)組中第二個(gè)一維數(shù)組里的第二個(gè)元素"+arr[1][1]);
//獲取二維數(shù)組的長(zhǎng)度
System.out.println("二維數(shù)組中的長(zhǎng)度"+arr.length);
System.out.println("二維數(shù)組中第一個(gè)一維數(shù)組的長(zhǎng)度"+arr[0].length);
System.out.println("二維數(shù)組中第二個(gè)一維數(shù)組的長(zhǎng)度"+arr[1].length);
}
}
以上是定義和初始化二維數(shù)組的基本案例,為了加深大家對(duì)二維數(shù)組的理解,接下來(lái)壹哥再設(shè)計(jì)幾個(gè)代碼案例,鞏固二維數(shù)組的用法。
4. 擴(kuò)展案例
4.1 動(dòng)態(tài)初始化的變形寫法
如果我們?cè)诙x二維數(shù)組時(shí),沒有給定一維數(shù)組的長(zhǎng)度,那么在使用數(shù)組之前,一定要先對(duì)一維數(shù)組進(jìn)行初始化。否則,此時(shí)如果直接使用一維數(shù)組,就會(huì)產(chǎn)生空指針異常java.lang.NullPointerException。
/**
* @author 一一哥Sun
* QQ:2312119590
* CSDN、掘金、知乎找我哦
* 千鋒教育
*/
public class Demo17 {
public static void main(String[] args) {
//動(dòng)態(tài)初始化時(shí)未限定一維數(shù)組的長(zhǎng)度
int[][] arr = new int[3][];
//如果我們?cè)诙x二維數(shù)組時(shí),沒有給定一維數(shù)組的長(zhǎng)度,那么在使用數(shù)組之前,一定要初始化里面的一維數(shù)組。
//否則,如果直接使用一維數(shù)組,就會(huì)產(chǎn)生空指針異常java.lang.NullPointerException
// arr3[0][0] = 100;
//初始化一維數(shù)組
arr[0] = new int[2];
arr[1] = new int[1];
arr[2] = new int[4];
//給數(shù)組賦值
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;
// 二維數(shù)組取值
System.out.println("二維數(shù)組中的第一個(gè)元素中的第一個(gè)元素" + arr[0][0]);
System.out.println("二維數(shù)組中的第一個(gè)元素中的第二個(gè)元素" + arr[0][1]);
System.out.println("二維數(shù)組中的第二個(gè)元素中的第一個(gè)元素" + arr[1][0]);
}
}
arr[0]=new int[2] 和 arr[1]=new int[1]
是在為最高維分配引用空間,也就是限制了最高維能保存數(shù)據(jù)的最大長(zhǎng)度。
4.2 遍歷二維數(shù)組
因?yàn)槎S數(shù)組中包含若干個(gè)一維數(shù)組,我們之前遍歷一維數(shù)組時(shí)要使用一個(gè)循環(huán),所以我們對(duì)二維數(shù)組進(jìn)行遍歷時(shí)就要使用嵌套的雙重循環(huán)。當(dāng)然,for/while/foreach等循環(huán)都可以使用。
/**
* @author 一一哥Sun
* QQ:2312119590
* CSDN、掘金、知乎找我哦
* 千鋒教育
*/
public class Demo18 {
public static void main(String[] args) {
// 二維數(shù)組--遍歷
//定義一個(gè)二維數(shù)組
int[][] arr = {{11,22,33},{55,66},{77,88,99}};
//使用雙重for循環(huán),遍歷二維數(shù)組
//第一層循環(huán):遍歷二維數(shù)組中有幾個(gè)一維數(shù)組
for (int i = 0; i < arr.length; i++) {
//arr[i]是一維數(shù)組
//第二層循環(huán):遍歷每個(gè)一維數(shù)組
for(int j = 0 ; j < arr[i].length ; j++) {
System.out.println("二維數(shù)組中第"+(i+1)+"個(gè)一維數(shù)組里的元素"+arr[i][j]);
}
}
}
}
5. 內(nèi)存分析
對(duì)于一個(gè)二維數(shù)組來(lái)說,比如int[][] array={{10,0,0,20,0},{0,30,40,0,0},{0,0,0,0,0}};
這個(gè)二維數(shù)組的結(jié)構(gòu)如下圖所示:
array[0]會(huì)獲取array數(shù)組的第1個(gè)元素,因?yàn)閍rray數(shù)組的每個(gè)元素都是一個(gè)一維數(shù)組,因此array[0]指向的數(shù)組就是{ 10, 0, 0, 20, 0 },其他的以此類推。
高維數(shù)組中的每個(gè)數(shù)據(jù)元素,保存的是低位數(shù)組的首地址。所以我們?cè)L問array[0]就相當(dāng)于是在訪問二維數(shù)組中的第一個(gè)一維數(shù)組的首地址,這樣就可以得到第一個(gè)一維數(shù)組。
三. 多維數(shù)組
理論上,在Java中我們可以定義出任意維度的數(shù)組。但高于二維的多維數(shù)組,在實(shí)際開發(fā)中很少使用,大家知道Java中支持這種數(shù)據(jù)結(jié)構(gòu)即可。如果你感興趣,可以嘗試著自己構(gòu)造一個(gè)三維數(shù)組出來(lái),壹哥就不在這里過多講解啦,可以參考如下:
//動(dòng)態(tài)初始化
int[][][] arr= new int[3][3][2];
//靜態(tài)初始化
int[][][] arr2= {
{
{1,2,3},{4,5,6},{7,8,9}
},
{
{1,2},{3,4}
},
{
{1,2},{3,4,5}
}
};
-------------------------------------------------???????正片已結(jié)束,來(lái)根事后煙-----------------------------------------------
四. 結(jié)語(yǔ)
至此,壹哥就把二維數(shù)組的內(nèi)容給大家介紹完了,現(xiàn)在你知道如何使用二維數(shù)組了嗎?二維數(shù)組的定義、動(dòng)態(tài)和靜態(tài)初始化、內(nèi)存分析都是今天的重點(diǎn),大家要牢牢掌握哦。
在下一篇文章中,壹哥會(huì)給大家講解Java里的可變參數(shù),敬請(qǐng)期待哦。另外如果你獨(dú)自學(xué)習(xí)覺得有很多困難,可以加入壹哥的學(xué)習(xí)互助群,我們一起交流學(xué)習(xí)。
五. 配套視頻
如果你不習(xí)慣閱讀技術(shù)文章,或是對(duì)文中的技術(shù)概念不能很好地理解,可以來(lái)看看壹哥幫你篩選出的視頻教程。與本文配套的Java學(xué)習(xí)視頻,鏈接如下:
bilibili html5 player文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-434061.html
六. 今日作業(yè)
利用二維數(shù)組,打印出一個(gè)楊輝三角形來(lái)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434061.html
到了這里,關(guān)于27從零開始學(xué)Java之詳解復(fù)雜的二維數(shù)組與多維數(shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!