Java基礎語法之二維數組詳解

一、二維數組

進入正題之前.首先為瞭便於大傢理解,我畫瞭一個圖:
xx槍戰遊戲中, 我是一個剛剛註冊賬號的小白,系統送瞭我兩把槍,此時,我的武器庫隻有這麼一層(可以理解為一位數組,槍就是對應的數組中對應的元素)

經過艱苦卓絕的戰鬥,終於有瞭一筆錢,現在我打算配置好的遊戲裝備,我現在有瞭一個槍櫃,它可以存放三層的槍械,每一層都可以放多把武器(這個就是二維數組,有多層,每層都是一個一維數組)

隨著遊戲時長和我的高超技術,獲取遊戲裝備的效率越來越高瞭,一個槍櫃已經存不下瞭,於是,我就有瞭多個槍櫃(這個就是多維數組,單個維度存放的就是單個的二維數組,單個二維數組中有多個一維數組~):

上圖從一維數組到多維數組的演變~是不是很形象,哈哈~

二維數組的定義

  • 二維數組,本質上就是一個數組,它內部又包含瞭多個一維數組
  • 二維數組也可以看成一個二維表,行*列組成的二維表,隻不過這個二維表,每一行的列數還可能不同。但是每一個單元格中的元素的數據類型是一致的,例如:都是int,都是String等

  • 二維數組的標記: [][]

二、二維數組的聲明與初始化

2.1 聲明

  • 聲明一個二維數組
  • int[][] arr;

語法格式

//推薦
元素的數據類型[][] 二維數組的名稱;
//不推薦
元素的數據類型  二維數組名[][];
//不推薦
元素的數據類型[]  二數組名

照例,我把一些不推薦但是不會造成編譯異常的寫法放上,因為有的面試題會遇到,有印象就好

2.2 初始化

  • 初始化如同一維數組一樣,同樣有兩種方法

2.2.1 靜態初始化

//1.先聲明,再靜態初始化
元素的數據類型[][] 二維數組名;
二維數組名 = new 元素的數據類型[][]{
			{元素1,元素2,元素3 。。。}, 
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//2.聲明並同時靜態初始化
元素的數據類型[][] 二維數組名 = new 元素的數據類型[][]{
			{元素1,元素2,元素3 。。。}, 
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//3.聲明並同時靜態初始化的簡化寫法
元素的數據類型[][] 二維數組的名稱 = {
			{元素1,元素2,元素3 。。。}, 
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//聲明二維數組
int[][] arr;
//靜態初始化
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}};//錯誤,靜態初始化,右邊new 數據類型[]中不能指定長度
//聲明並同時初始化
int[][] arr = new int

示例代碼1:

public class Array2Demo1 {
	public static void main(String[] args) {
		//定義數組
		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) {
        // 靜態初始化
        // 定義一個二維數組MM資源庫
        String[][] girls = new String[][]{ {"北方小姐姐","南方小姐姐","臺灣小姐姐"},{"東京小姐姐","北海道小姐姐"},{"俄羅斯小姐姐","紐約小姐姐","烏克蘭小姐姐"} };
         /*
        * 打印各個維度數組的元素
        * 在我的認知中,世界上最美的MM國傢分佈
        * 於是我創建瞭一個二維數組MM資源庫,總共分為三個一位數組,
        * 分別來自,中國,日本和其他國傢的小姐姐~~
        * 另外,每個地區我都放入瞭一些地區的小姐姐進去
        * */
        // 獲取第一個數組中的北方小姐姐
        System.out.println(girls[0][0]);
        // 獲取第一個數組中的南方小姐姐
        System.out.println(girls[0][1]);
        // 獲取第二個數組中的東京小姐姐
        System.out.println(girls[1][0]);
        // 獲取第三個組中的烏克蘭小姐姐
        System.out.println(girls[2][2]);
    }
}

2.2.2 動態初始化

動態初始化創建可以不用聲明裡面一維數組的長度,因此,它每個一維數組長度可以不一樣,so,就有瞭下面兩種初始化方式:

  • 動態初始化一(規則二維表)

程序員指定數組的長度,後期再賦值(系統會先給定元素默認初始值)

規則二維表:每一行的列數是相同的

格式

//(1)確定行數和列數
元素的數據類型[][] 二維數組名 = new 元素的數據類型[m][n];
m:表示這個二維數組有多少個一維數組。或者說一共二維表有幾行
n:表示每一個一維數組的元素有多少個。或者說每一行共有一個單元格
 
//此時創建完數組,行數、列數確定,而且元素也都有默認值
//(2)再為元素賦新值
二維數組名[行下標][列下標] = 值;

示例代碼:

public static void main(String[] args) {
    //定義一個二維數組
    int[][] arr = new int[3][2];
    
    //定義瞭一個二維數組arr
    //這個二維數組有3個一維數組的元素
    //每一個一維數組有2個元素
    //輸出二維數組名稱
    System.out.println(arr); //地址值	[[[email protected]
    
    //輸出二維數組的第一個元素一維數組的名稱
    System.out.println(arr[0]); //地址值	[[email protected]
    System.out.println(arr[1]); //地址值	[[email protected]
    System.out.println(arr[2]); //地址值	[[email protected]
    
    //輸出二維數組的元素
    System.out.println(arr[0][0]); //0
    System.out.println(arr[0][1]); //0
}

動態初始化二(不規則二維表)

不規則二維表:每一行的列數可能不一樣 

格式

//(1)先確定總行數
元素的數據類型[][] 二維數組名 = new 元素的數據類型[總行數][];
//此時隻是確定瞭總行數,每一行裡面現在是null
//(2)再確定每一行的列數,創建每一行的一維數組
二維數組名[行下標] = new 元素的數據類型[該行的總列數];
//此時已經new完的行的元素就有默認值瞭,沒有new的行還是null
//(3)再為元素賦值
二維數組名[行下標][列下標] = 值;

不規則二維表,聲明後,初始話內部一維數組時不能簡寫

// 不規則二維表
// 定義二維數組
int[][] arr = new int[3][]; // 3行,未知的列
 
// 初始化二維數組內的元素值
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) {
        //定義數組
        int[][] arr = new int[3][];
        System.out.println(arr);	//[[[email protected]
        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
        //動態的為每一個一維數組分配空間
        arr[0] = new int[2];
        arr[1] = new int[3];
        arr[2] = new int[1];
        System.out.println(arr[0]); //[[email protected]
        System.out.println(arr[1]); //[[email protected]
        System.out.println(arr[2]); //[[email protected]
        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) {
 
        // 動態初始化
        /*
        * 定義一個二維數組的槍櫃,
        * 它存放瞭三層槍械,
        * 第一層存放的是狙擊槍,第二層存放的是步槍,第三層存放的是輔助武器
        * 我買瞭這個槍櫃,但並不是每一層存放的槍械數量相等,因此,我需要動態初始化這個槍櫃(數組)
        * */
        String[][] Guns = new String[3][];
 
        // 將兩把狙擊槍放入第一層狙擊槍的槍櫃中
        String[] GunMagazine = {"AWM","Bird sniper"};
 
        // 後來,我又買瞭三把步槍,也需要存放到槍櫃裡
        String[] rifle = {"AK47","M4A1 QBZ95"};
 
        // 裝備很齊全瞭,下面,我還需要一些配件,輔助我取得遊戲勝利
        String[] auxiliaryWeapon = {"(手槍)pistol","(手雷)antitank grenade", "(煙霧彈)smoke bomb"};
    }
}

註意事項:如果是靜態初始化,右邊new 數據類型[][]中不能寫數字,因為行數和列數,由{}的元素個數決定

三、二維數組的遍歷

  • 二維數組的遍歷,同一維數組一樣,區別就是,我們首先在外循環,遍歷每一個一維數組,內循環中的 I 就是每一個一維數組的內存偽地址
  • 格式
for(int i=0; i<二維數組名.length; i++){
    for(int j=0; j<二維數組名[i].length; j++){
        System.out.print(二維數組名[i][j]);
    }
    System.out.println();
}

四、二維數組的內存圖分析

二維數組再內存圖中的流程,如下圖:

流程步驟:

1.首先創建main方法,這個main方法會存在棧內存中,(這個內存中的棧,堆前面有提到過,忘瞭沒關系,我下一章還會再分享一下)

2.靜態初始化創建二維數組arr, 於是在棧內存中,創建一個 int[][] arr= 

3.在棧內存創建二維數組int[][]時,裡面的值會在堆內存開辟一個空間,左邊的是二維數組,因為存儲瞭三個一維數組,因此,它有三個元素,右邊分別開辟三個一維數組的內存空間

4.每個內存空間都有一個地址,二維數組中存儲的是一維數組的地址,而棧內存int[][]arr = 存儲的是二維數組的內存地址

5.所以,第一個打印arr的二維數組是Java源碼轉換後的內存地址,第二個是二維數組中第一個一維數組的內存地址

6.第三個打印是二維數組中第一個一維數組中的第一個元素

五、數組操作的常見異常

數組越界異常

示例代碼:

public static void main(String[] args) {
   int[] arr = {1,2,3};
   System.out.println(arr[3]);
}

越界異常圖

異常原因

創建數組,賦值3個元素,數組的索引就是0,1,2,沒有3索引,因此我們不能訪問數組中不存在的索引,程序運行後,將會拋出 ArrayIndexOutOfBoundsException 數組越界異常。在開發中,數組的越界異常是不能出現的,一旦出現瞭,就必須要修改我們編寫的代碼

數組空指針異常

示例代碼:

 public static void main(String[] args) {
        //定義數組
        int[][] arr = new int[3][];
       
       System.out.println(arr[0][0]);//NullPointerException
   }

空指針異常圖

異常原因

異常原因:因為此時數組的每一行還未分配具體存儲元素的空間,此時arr[0]是null,此時訪問arr[0][0]會拋出NullPointerException 空指針異常。

六、總結

本章介紹瞭一下二維數組的相關介紹,至此,數組和Java的一些基本語法就完啦,下一章開始介紹面向對象,面向對象細節比較多,依舊是重在理解,理解,多做做案例,我抽空整理一下案例題,方便各位搭配我的文章進行知識點鞏固,查漏補缺~~

到此這篇關於Java基礎語法之二維數組詳解的文章就介紹到這瞭,更多相關Java二維數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: