Java基礎(chǔ)語法之二維數(shù)組詳解
一、二維數(shù)組
進(jìn)入正題之前.首先為了便于大家理解,我畫了一個圖:
xx槍戰(zhàn)游戲中, 我是一個剛剛注冊賬號的小白,系統(tǒng)送了我兩把槍,此時,我的武器庫只有這么一層(可以理解為一位數(shù)組,槍就是對應(yīng)的數(shù)組中對應(yīng)的元素)

經(jīng)過艱苦卓絕的戰(zhàn)斗,終于有了一筆錢,現(xiàn)在我打算配置好的游戲裝備,我現(xiàn)在有了一個槍柜,它可以存放三層的槍械,每一層都可以放多把武器(這個就是二維數(shù)組,有多層,每層都是一個一維數(shù)組)

隨著游戲時長和我的高超技術(shù),獲取游戲裝備的效率越來越高了,一個槍柜已經(jīng)存不下了,于是,我就有了多個槍柜(這個就是多維數(shù)組,單個維度存放的就是單個的二維數(shù)組,單個二維數(shù)組中有多個一維數(shù)組~):

上圖從一維數(shù)組到多維數(shù)組的演變~是不是很形象,哈哈~
二維數(shù)組的定義
- 二維數(shù)組,本質(zhì)上就是一個數(shù)組,它內(nèi)部又包含了多個一維數(shù)組
- 二維數(shù)組也可以看成一個二維表,行*列組成的二維表,只不過這個二維表,每一行的列數(shù)還可能不同。但是每一個單元格中的元素的數(shù)據(jù)類型是一致的,例如:都是int,都是String等

- 二維數(shù)組的標(biāo)記: [][]
二、二維數(shù)組的聲明與初始化
2.1 聲明
- 聲明一個二維數(shù)組
- int[][] arr;
語法格式
//推薦 元素的數(shù)據(jù)類型[][] 二維數(shù)組的名稱; //不推薦 元素的數(shù)據(jù)類型 二維數(shù)組名[][]; //不推薦 元素的數(shù)據(jù)類型[] 二數(shù)組名
照例,我把一些不推薦但是不會造成編譯異常的寫法放上,因?yàn)橛械拿嬖囶}會遇到,有印象就好
2.2 初始化
- 初始化如同一維數(shù)組一樣,同樣有兩種方法
2.2.1 靜態(tài)初始化
//1.先聲明,再靜態(tài)初始化
元素的數(shù)據(jù)類型[][] 二維數(shù)組名;
二維數(shù)組名 = new 元素的數(shù)據(jù)類型[][]{
{元素1,元素2,元素3 。。。},
{第二行的值列表},
...
{第n行的值列表}
};
//2.聲明并同時靜態(tài)初始化
元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[][]{
{元素1,元素2,元素3 。。。},
{第二行的值列表},
...
{第n行的值列表}
};
//3.聲明并同時靜態(tài)初始化的簡化寫法
元素的數(shù)據(jù)類型[][] 二維數(shù)組的名稱 = {
{元素1,元素2,元素3 。。。},
{第二行的值列表},
...
{第n行的值列表}
};
//聲明二維數(shù)組
int[][] arr;
//靜態(tài)初始化
arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
//arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9}};//錯誤,靜態(tài)初始化,右邊new 數(shù)據(jù)類型[]中不能指定長度
//聲明并同時初始化
int[][] arr = new int
示例代碼1:
public class Array2Demo1 {
public static void main(String[] args) {
//定義數(shù)組
int[][] arr = {{1,2,3},{4,5},{6}};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][0]); //1
System.out.println(arr[1][0]); //4
System.out.println(arr[2][0]); //6
System.out.println(arr[0][1]); //2
System.out.println(arr[1][1]); //5
//越界
System.out.println(arr[2][1]); //錯誤
}
}
示例代碼2:
public class TwoArryTest {
public static void main(String[] args) {
// 靜態(tài)初始化
// 定義一個二維數(shù)組MM資源庫
String[][] girls = new String[][]{ {"北方小姐姐","南方小姐姐","臺灣小姐姐"},{"東京小姐姐","北海道小姐姐"},{"俄羅斯小姐姐","紐約小姐姐","烏克蘭小姐姐"} };
/*
* 打印各個維度數(shù)組的元素
* 在我的認(rèn)知中,世界上最美的MM國家分布
* 于是我創(chuàng)建了一個二維數(shù)組MM資源庫,總共分為三個一位數(shù)組,
* 分別來自,中國,日本和其他國家的小姐姐~~
* 另外,每個地區(qū)我都放入了一些地區(qū)的小姐姐進(jìn)去
* */
// 獲取第一個數(shù)組中的北方小姐姐
System.out.println(girls[0][0]);
// 獲取第一個數(shù)組中的南方小姐姐
System.out.println(girls[0][1]);
// 獲取第二個數(shù)組中的東京小姐姐
System.out.println(girls[1][0]);
// 獲取第三個組中的烏克蘭小姐姐
System.out.println(girls[2][2]);
}
}
2.2.2 動態(tài)初始化
動態(tài)初始化創(chuàng)建可以不用聲明里面一維數(shù)組的長度,因此,它每個一維數(shù)組長度可以不一樣,so,就有了下面兩種初始化方式:
- 動態(tài)初始化一(規(guī)則二維表)
程序員指定數(shù)組的長度,后期再賦值(系統(tǒng)會先給定元素默認(rèn)初始值)
規(guī)則二維表:每一行的列數(shù)是相同的
格式
//(1)確定行數(shù)和列數(shù) 元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[m][n]; m:表示這個二維數(shù)組有多少個一維數(shù)組。或者說一共二維表有幾行 n:表示每一個一維數(shù)組的元素有多少個。或者說每一行共有一個單元格 //此時創(chuàng)建完數(shù)組,行數(shù)、列數(shù)確定,而且元素也都有默認(rèn)值 //(2)再為元素賦新值 二維數(shù)組名[行下標(biāo)][列下標(biāo)] = 值;
示例代碼:
public static void main(String[] args) {
//定義一個二維數(shù)組
int[][] arr = new int[3][2];
//定義了一個二維數(shù)組arr
//這個二維數(shù)組有3個一維數(shù)組的元素
//每一個一維數(shù)組有2個元素
//輸出二維數(shù)組名稱
System.out.println(arr); //地址值 [[I@175078b
//輸出二維數(shù)組的第一個元素一維數(shù)組的名稱
System.out.println(arr[0]); //地址值 [I@42552c
System.out.println(arr[1]); //地址值 [I@e5bbd6
System.out.println(arr[2]); //地址值 [I@8ee016
//輸出二維數(shù)組的元素
System.out.println(arr[0][0]); //0
System.out.println(arr[0][1]); //0
}
動態(tài)初始化二(不規(guī)則二維表)
不規(guī)則二維表:每一行的列數(shù)可能不一樣
格式
//(1)先確定總行數(shù) 元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[總行數(shù)][]; //此時只是確定了總行數(shù),每一行里面現(xiàn)在是null //(2)再確定每一行的列數(shù),創(chuàng)建每一行的一維數(shù)組 二維數(shù)組名[行下標(biāo)] = new 元素的數(shù)據(jù)類型[該行的總列數(shù)]; //此時已經(jīng)new完的行的元素就有默認(rèn)值了,沒有new的行還是null //(3)再為元素賦值 二維數(shù)組名[行下標(biāo)][列下標(biāo)] = 值;
不規(guī)則二維表,聲明后,初始話內(nèi)部一維數(shù)組時不能簡寫
// 不規(guī)則二維表
// 定義二維數(shù)組
int[][] arr = new int[3][]; // 3行,未知的列
// 初始化二維數(shù)組內(nèi)的元素值
arr[0] = new int[]{1}; // 此處不能簡寫為 arr[0] = {1}
arr[1] = new int[]{2,3};
arr[2] = new int[]{4,5,6,7};
示例代碼1:
public class TwoArryTest {
public static void main(String[] args) {
//定義數(shù)組
int[][] arr = new int[3][];
System.out.println(arr); //[[I@175078b
System.out.println(arr[1][0]);//NullPointerException
System.out.println(arr[0]); //null
System.out.println(arr[1]); //null
System.out.println(arr[2]); //null
//動態(tài)的為每一個一維數(shù)組分配空間
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[1];
System.out.println(arr[0]); //[I@42552c
System.out.println(arr[1]); //[I@e5bbd6
System.out.println(arr[2]); //[I@8ee016
System.out.println(arr[0][0]); //0
System.out.println(arr[0][1]); //0
//ArrayIndexOutOfBoundsException
//System.out.println(arr[0][2]); //錯誤
arr[1][0] = 100;
arr[1][2] = 200;
}
}
示例代碼2:
public class TwoArryTest {
public static void main(String[] args) {
// 動態(tài)初始化
/*
* 定義一個二維數(shù)組的槍柜,
* 它存放了三層槍械,
* 第一層存放的是狙擊槍,第二層存放的是步槍,第三層存放的是輔助武器
* 我買了這個槍柜,但并不是每一層存放的槍械數(shù)量相等,因此,我需要動態(tài)初始化這個槍柜(數(shù)組)
* */
String[][] Guns = new String[3][];
// 將兩把狙擊槍放入第一層狙擊槍的槍柜中
String[] GunMagazine = {"AWM","Bird sniper"};
// 后來,我又買了三把步槍,也需要存放到槍柜里
String[] rifle = {"AK47","M4A1 QBZ95"};
// 裝備很齊全了,下面,我還需要一些配件,輔助我取得游戲勝利
String[] auxiliaryWeapon = {"(手槍)pistol","(手雷)antitank grenade", "(煙霧彈)smoke bomb"};
}
}
注意事項(xiàng):如果是靜態(tài)初始化,右邊new 數(shù)據(jù)類型[][]中不能寫數(shù)字,因?yàn)樾袛?shù)和列數(shù),由{}的元素個數(shù)決定
三、二維數(shù)組的遍歷
- 二維數(shù)組的遍歷,同一維數(shù)組一樣,區(qū)別就是,我們首先在外循環(huán),遍歷每一個一維數(shù)組,內(nèi)循環(huán)中的 I 就是每一個一維數(shù)組的內(nèi)存?zhèn)蔚刂?/li>
- 格式
for(int i=0; i<二維數(shù)組名.length; i++){
for(int j=0; j<二維數(shù)組名[i].length; j++){
System.out.print(二維數(shù)組名[i][j]);
}
System.out.println();
}
四、二維數(shù)組的內(nèi)存圖分析
二維數(shù)組再內(nèi)存圖中的流程,如下圖:

流程步驟:
1.首先創(chuàng)建main方法,這個main方法會存在棧內(nèi)存中,(這個內(nèi)存中的棧,堆前面有提到過,忘了沒關(guān)系,我下一章還會再分享一下)
2.靜態(tài)初始化創(chuàng)建二維數(shù)組arr, 于是在棧內(nèi)存中,創(chuàng)建一個 int[][] arr=
3.在棧內(nèi)存創(chuàng)建二維數(shù)組int[][]時,里面的值會在堆內(nèi)存開辟一個空間,左邊的是二維數(shù)組,因?yàn)榇鎯α巳齻€一維數(shù)組,因此,它有三個元素,右邊分別開辟三個一維數(shù)組的內(nèi)存空間
4.每個內(nèi)存空間都有一個地址,二維數(shù)組中存儲的是一維數(shù)組的地址,而棧內(nèi)存int[][]arr = 存儲的是二維數(shù)組的內(nèi)存地址
5.所以,第一個打印arr的二維數(shù)組是Java源碼轉(zhuǎn)換后的內(nèi)存地址,第二個是二維數(shù)組中第一個一維數(shù)組的內(nèi)存地址
6.第三個打印是二維數(shù)組中第一個一維數(shù)組中的第一個元素
五、數(shù)組操作的常見異常
數(shù)組越界異常
示例代碼:
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
越界異常圖

異常原因
創(chuàng)建數(shù)組,賦值3個元素,數(shù)組的索引就是0,1,2,沒有3索引,因此我們不能訪問數(shù)組中不存在的索引,程序運(yùn)行后,將會拋出 ArrayIndexOutOfBoundsException 數(shù)組越界異常。在開發(fā)中,數(shù)組的越界異常是不能出現(xiàn)的,一旦出現(xiàn)了,就必須要修改我們編寫的代碼
數(shù)組空指針異常
示例代碼:
public static void main(String[] args) {
//定義數(shù)組
int[][] arr = new int[3][];
System.out.println(arr[0][0]);//NullPointerException
}
空指針異常圖


異常原因
異常原因:因?yàn)榇藭r數(shù)組的每一行還未分配具體存儲元素的空間,此時arr[0]是null,此時訪問arr[0][0]會拋出NullPointerException 空指針異常。
六、總結(jié)
本章介紹了一下二維數(shù)組的相關(guān)介紹,至此,數(shù)組和Java的一些基本語法就完啦,下一章開始介紹面向?qū)ο?,面向?qū)ο蠹?xì)節(jié)比較多,依舊是重在理解,理解,多做做案例,我抽空整理一下案例題,方便各位搭配我的文章進(jìn)行知識點(diǎn)鞏固,查漏補(bǔ)缺~~
到此這篇關(guān)于Java基礎(chǔ)語法之二維數(shù)組詳解的文章就介紹到這了,更多相關(guān)Java二維數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java14對于NullPointerException的新處理方式示例解析
這篇文章主要為大家介紹了Java14對于NullPointerException的新處理方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
springboot返回modelandview頁面的實(shí)例
這篇文章主要介紹了springboot返回modelandview頁面的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

