最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解

 更新時(shí)間:2021年05月08日 15:40:37   作者:GaryLea  
這篇文章主要介紹了Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下

一、二維數(shù)組

進(jìn)入正題之前.首先為了便于大家理解,我畫(huà)了一個(gè)圖:
xx槍?xiě)?zhàn)游戲中, 我是一個(gè)剛剛注冊(cè)賬號(hào)的小白,系統(tǒng)送了我兩把槍,此時(shí),我的武器庫(kù)只有這么一層(可以理解為一位數(shù)組,槍就是對(duì)應(yīng)的數(shù)組中對(duì)應(yīng)的元素)

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

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


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

二維數(shù)組的定義

  • 二維數(shù)組,本質(zhì)上就是一個(gè)數(shù)組,它內(nèi)部又包含了多個(gè)一維數(shù)組
  • 二維數(shù)組也可以看成一個(gè)二維表,行*列組成的二維表,只不過(guò)這個(gè)二維表,每一行的列數(shù)還可能不同。但是每一個(gè)單元格中的元素的數(shù)據(jù)類型是一致的,例如:都是int,都是String等

  • 二維數(shù)組的標(biāo)記: [][]

二、二維數(shù)組的聲明與初始化

2.1 聲明

  • 聲明一個(gè)二維數(shù)組
  • int[][] arr;

語(yǔ)法格式

//推薦
元素的數(shù)據(jù)類型[][] 二維數(shù)組的名稱;
//不推薦
元素的數(shù)據(jù)類型  二維數(shù)組名[][];
//不推薦
元素的數(shù)據(jù)類型[]  二數(shù)組名

照例,我把一些不推薦但是不會(huì)造成編譯異常的寫(xiě)法放上,因?yàn)橛械拿嬖囶}會(huì)遇到,有印象就好

2.2 初始化

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

2.2.1 靜態(tài)初始化

//1.先聲明,再靜態(tài)初始化
元素的數(shù)據(jù)類型[][] 二維數(shù)組名;
二維數(shù)組名 = new 元素的數(shù)據(jù)類型[][]{
			{元素1,元素2,元素3 。。。}, 
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//2.聲明并同時(shí)靜態(tài)初始化
元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[][]{
			{元素1,元素2,元素3 。。。}, 
			{第二行的值列表},
			...
			{第n行的值列表}
		};
//3.聲明并同時(shí)靜態(tài)初始化的簡(jiǎn)化寫(xiě)法
元素的數(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}};//錯(cuò)誤,靜態(tài)初始化,右邊new 數(shù)據(jù)類型[]中不能指定長(zhǎng)度
//聲明并同時(shí)初始化
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]); //錯(cuò)誤
	}
}

示例代碼2:

public class TwoArryTest {
    public static void main(String[] args) {
        // 靜態(tài)初始化
        // 定義一個(gè)二維數(shù)組MM資源庫(kù)
        String[][] girls = new String[][]{ {"北方小姐姐","南方小姐姐","臺(tái)灣小姐姐"},{"東京小姐姐","北海道小姐姐"},{"俄羅斯小姐姐","紐約小姐姐","烏克蘭小姐姐"} };
         /*
        * 打印各個(gè)維度數(shù)組的元素
        * 在我的認(rèn)知中,世界上最美的MM國(guó)家分布
        * 于是我創(chuàng)建了一個(gè)二維數(shù)組MM資源庫(kù),總共分為三個(gè)一位數(shù)組,
        * 分別來(lái)自,中國(guó),日本和其他國(guó)家的小姐姐~~
        * 另外,每個(gè)地區(qū)我都放入了一些地區(qū)的小姐姐進(jìn)去
        * */
        // 獲取第一個(gè)數(shù)組中的北方小姐姐
        System.out.println(girls[0][0]);
        // 獲取第一個(gè)數(shù)組中的南方小姐姐
        System.out.println(girls[0][1]);
        // 獲取第二個(gè)數(shù)組中的東京小姐姐
        System.out.println(girls[1][0]);
        // 獲取第三個(gè)組中的烏克蘭小姐姐
        System.out.println(girls[2][2]);
    }
}

2.2.2 動(dòng)態(tài)初始化

動(dòng)態(tài)初始化創(chuàng)建可以不用聲明里面一維數(shù)組的長(zhǎng)度,因此,它每個(gè)一維數(shù)組長(zhǎng)度可以不一樣,so,就有了下面兩種初始化方式:

  • 動(dòng)態(tài)初始化一(規(guī)則二維表)

程序員指定數(shù)組的長(zhǎng)度,后期再賦值(系統(tǒng)會(huì)先給定元素默認(rèn)初始值)

規(guī)則二維表:每一行的列數(shù)是相同的

格式

//(1)確定行數(shù)和列數(shù)
元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[m][n];
m:表示這個(gè)二維數(shù)組有多少個(gè)一維數(shù)組?;蛘哒f(shuō)一共二維表有幾行
n:表示每一個(gè)一維數(shù)組的元素有多少個(gè)?;蛘哒f(shuō)每一行共有一個(gè)單元格
 
//此時(shí)創(chuàng)建完數(shù)組,行數(shù)、列數(shù)確定,而且元素也都有默認(rèn)值
//(2)再為元素賦新值
二維數(shù)組名[行下標(biāo)][列下標(biāo)] = 值;

示例代碼:

public static void main(String[] args) {
    //定義一個(gè)二維數(shù)組
    int[][] arr = new int[3][2];
    
    //定義了一個(gè)二維數(shù)組arr
    //這個(gè)二維數(shù)組有3個(gè)一維數(shù)組的元素
    //每一個(gè)一維數(shù)組有2個(gè)元素
    //輸出二維數(shù)組名稱
    System.out.println(arr); //地址值	[[I@175078b
    
    //輸出二維數(shù)組的第一個(gè)元素一維數(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
}

動(dòng)態(tài)初始化二(不規(guī)則二維表)

不規(guī)則二維表:每一行的列數(shù)可能不一樣 

格式

//(1)先確定總行數(shù)
元素的數(shù)據(jù)類型[][] 二維數(shù)組名 = new 元素的數(shù)據(jù)類型[總行數(shù)][];
//此時(shí)只是確定了總行數(shù),每一行里面現(xiàn)在是null
//(2)再確定每一行的列數(shù),創(chuàng)建每一行的一維數(shù)組
二維數(shù)組名[行下標(biāo)] = new 元素的數(shù)據(jù)類型[該行的總列數(shù)];
//此時(shí)已經(jīng)new完的行的元素就有默認(rèn)值了,沒(méi)有new的行還是null
//(3)再為元素賦值
二維數(shù)組名[行下標(biāo)][列下標(biāo)] = 值;

不規(guī)則二維表,聲明后,初始話內(nèi)部一維數(shù)組時(shí)不能簡(jiǎn)寫(xiě)

// 不規(guī)則二維表
// 定義二維數(shù)組
int[][] arr = new int[3][]; // 3行,未知的列
 
// 初始化二維數(shù)組內(nèi)的元素值
arr[0] = new int[]{1}; // 此處不能簡(jiǎn)寫(xiě)為 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
        //動(dòng)態(tài)的為每一個(gè)一維數(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]); //錯(cuò)誤
        arr[1][0] = 100;
        arr[1][2] = 200;
    }
}

示例代碼2:

public class TwoArryTest {
    public static void main(String[] args) {
 
        // 動(dòng)態(tài)初始化
        /*
        * 定義一個(gè)二維數(shù)組的槍柜,
        * 它存放了三層槍械,
        * 第一層存放的是狙擊槍,第二層存放的是步槍,第三層存放的是輔助武器
        * 我買(mǎi)了這個(gè)槍柜,但并不是每一層存放的槍械數(shù)量相等,因此,我需要?jiǎng)討B(tài)初始化這個(gè)槍柜(數(shù)組)
        * */
        String[][] Guns = new String[3][];
 
        // 將兩把狙擊槍放入第一層狙擊槍的槍柜中
        String[] GunMagazine = {"AWM","Bird sniper"};
 
        // 后來(lái),我又買(mǎi)了三把步槍,也需要存放到槍柜里
        String[] rifle = {"AK47","M4A1 QBZ95"};
 
        // 裝備很齊全了,下面,我還需要一些配件,輔助我取得游戲勝利
        String[] auxiliaryWeapon = {"(手槍)pistol","(手雷)antitank grenade", "(煙霧彈)smoke bomb"};
    }
}

注意事項(xiàng):如果是靜態(tài)初始化,右邊new 數(shù)據(jù)類型[][]中不能寫(xiě)數(shù)字,因?yàn)樾袛?shù)和列數(shù),由{}的元素個(gè)數(shù)決定

三、二維數(shù)組的遍歷

  • 二維數(shù)組的遍歷,同一維數(shù)組一樣,區(qū)別就是,我們首先在外循環(huán),遍歷每一個(gè)一維數(shù)組,內(nèi)循環(huán)中的 I 就是每一個(gè)一維數(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方法,這個(gè)main方法會(huì)存在棧內(nèi)存中,(這個(gè)內(nèi)存中的棧,堆前面有提到過(guò),忘了沒(méi)關(guān)系,我下一章還會(huì)再分享一下)

2.靜態(tài)初始化創(chuàng)建二維數(shù)組arr, 于是在棧內(nèi)存中,創(chuàng)建一個(gè) int[][] arr= 

3.在棧內(nèi)存創(chuàng)建二維數(shù)組int[][]時(shí),里面的值會(huì)在堆內(nèi)存開(kāi)辟一個(gè)空間,左邊的是二維數(shù)組,因?yàn)榇鎯?chǔ)了三個(gè)一維數(shù)組,因此,它有三個(gè)元素,右邊分別開(kāi)辟三個(gè)一維數(shù)組的內(nèi)存空間

4.每個(gè)內(nèi)存空間都有一個(gè)地址,二維數(shù)組中存儲(chǔ)的是一維數(shù)組的地址,而棧內(nèi)存int[][]arr = 存儲(chǔ)的是二維數(shù)組的內(nèi)存地址

5.所以,第一個(gè)打印arr的二維數(shù)組是Java源碼轉(zhuǎn)換后的內(nèi)存地址,第二個(gè)是二維數(shù)組中第一個(gè)一維數(shù)組的內(nèi)存地址

6.第三個(gè)打印是二維數(shù)組中第一個(gè)一維數(shù)組中的第一個(gè)元素

五、數(shù)組操作的常見(jiàn)異常

數(shù)組越界異常

示例代碼:

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

越界異常圖

異常原因

創(chuàng)建數(shù)組,賦值3個(gè)元素,數(shù)組的索引就是0,1,2,沒(méi)有3索引,因此我們不能訪問(wèn)數(shù)組中不存在的索引,程序運(yùn)行后,將會(huì)拋出 ArrayIndexOutOfBoundsException 數(shù)組越界異常。在開(kāi)發(fā)中,數(shù)組的越界異常是不能出現(xiàn)的,一旦出現(xiàn)了,就必須要修改我們編寫(xiě)的代碼

數(shù)組空指針異常

示例代碼:

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

空指針異常圖

異常原因

異常原因:因?yàn)榇藭r(shí)數(shù)組的每一行還未分配具體存儲(chǔ)元素的空間,此時(shí)arr[0]是null,此時(shí)訪問(wèn)arr[0][0]會(huì)拋出NullPointerException 空指針異常。

六、總結(jié)

本章介紹了一下二維數(shù)組的相關(guān)介紹,至此,數(shù)組和Java的一些基本語(yǔ)法就完啦,下一章開(kāi)始介紹面向?qū)ο螅嫦驅(qū)ο蠹?xì)節(jié)比較多,依舊是重在理解,理解,多做做案例,我抽空整理一下案例題,方便各位搭配我的文章進(jìn)行知識(shí)點(diǎn)鞏固,查漏補(bǔ)缺~~

到此這篇關(guān)于Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解的文章就介紹到這了,更多相關(guān)Java二維數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MapTask階段shuffle源碼分析

    MapTask階段shuffle源碼分析

    今天小編就為大家分享一篇關(guān)于MapTask階段shuffle源碼分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Mybatis-plus通過(guò)添加攔截器實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)權(quán)限

    Mybatis-plus通過(guò)添加攔截器實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)權(quán)限

    系統(tǒng)需要根據(jù)用戶所屬的公司,來(lái)做一下數(shù)據(jù)權(quán)限控制,具體一點(diǎn),就是通過(guò)表中的company_id進(jìn)行權(quán)限控制,項(xiàng)目使用的是mybatis-plus,所以通過(guò)添加攔截器的方式,修改查詢sql,實(shí)現(xiàn)數(shù)據(jù)權(quán)限,本文就通過(guò)代碼給大家詳細(xì)的講解一下,需要的朋友可以參考下
    2023-08-08
  • SpringBoot的Admin服務(wù)監(jiān)控詳解

    SpringBoot的Admin服務(wù)監(jiān)控詳解

    這篇文章主要介紹了SpringBoot的Admin服務(wù)監(jiān)控詳解,Spring Boot Admin(SBA)是一個(gè)開(kāi)源的社區(qū)項(xiàng)目,用于管理和監(jiān)控 Spring Boot 應(yīng)用程序,需要的朋友可以參考下
    2024-01-01
  • springIoc及注解的使用實(shí)例詳解

    springIoc及注解的使用實(shí)例詳解

    注解(Annotation)是一種在 Java 程序中以元數(shù)據(jù)的形式對(duì)代碼進(jìn)行標(biāo)記和說(shuō)明的機(jī)制,它可以被添加到類、方法、字段、參數(shù)等程序元素上,用于提供額外的信息和指示,本文給大家介紹springIoc及注解的使用,感興趣的朋友一起看看吧
    2024-02-02
  • 使用IDEA打jar包的詳細(xì)圖文教程

    使用IDEA打jar包的詳細(xì)圖文教程

    JAR文件是一種壓縮文件,與常見(jiàn)的ZIP壓縮文件兼容,被稱為JAR包,下面這篇文章主要給大家介紹了關(guān)于使用IDEA打jar包的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • SpringCloud中的Eureka集群配置方法

    SpringCloud中的Eureka集群配置方法

    這篇文章主要介紹了SpringCloud中的Eureka集群配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • java中File類應(yīng)用遍歷文件夾下所有文件

    java中File類應(yīng)用遍歷文件夾下所有文件

    這篇文章主要為大家詳細(xì)介紹了java中File類應(yīng)用遍歷文件夾下所有文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java日期時(shí)間格式化操作DateUtils 的整理

    Java日期時(shí)間格式化操作DateUtils 的整理

    這篇文章主要介紹了Java日期時(shí)間格式化操作DateUtils 的整理的相關(guān)資料,這里總結(jié)了java日期格式化的操作,需要的朋友可以參考下
    2017-07-07
  • 解決BeanUtils.copyProperties無(wú)法成功封裝的問(wèn)題

    解決BeanUtils.copyProperties無(wú)法成功封裝的問(wèn)題

    這篇文章主要介紹了解決BeanUtils.copyProperties無(wú)法成功封裝的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot中@ComponentScan的使用詳解

    SpringBoot中@ComponentScan的使用詳解

    這篇文章主要介紹了SpringBoot中@ComponentScan的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

股票| 宝坻区| 治多县| 开化县| 宜兰县| 庆阳市| 岑溪市| 新建县| 太保市| 监利县| 石狮市| 彭州市| 澳门| 广昌县| 昌图县| 荥经县| 刚察县| 长春市| 永州市| 鸡东县| 民权县| 彰化县| 冷水江市| 顺昌县| 临清市| 上林县| 华亭县| 武川县| 航空| 宜兴市| 桐乡市| 马鞍山市| 比如县| 贞丰县| 宾阳县| 湘乡市| 耒阳市| 山西省| 韩城市| 渭南市| 承德市|