您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在Java中使用二維數(shù)組,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
1.SpringMVC,Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架。2.Shiro,Apache Shiro是Java的一個(gè)安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。4.Dubbo,Dubbo是一個(gè)分布式服務(wù)框架。5.Maven,Maven是個(gè)項(xiàng)目管理和構(gòu)建自動(dòng)化工具。6.RabbitMQ,RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器。7.Ehcache,EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架。
進(jìn)入正題之前.首先為了便于大家理解,我畫了一個(gè)圖:
xx槍戰(zhàn)游戲中, 我是一個(gè)剛剛注冊(cè)賬號(hào)的小白,系統(tǒng)送了我兩把槍,此時(shí),我的武器庫(kù)只有這么一層(可以理解為一位數(shù)組,槍就是對(duì)應(yīng)的數(shù)組中對(duì)應(yīng)的元素)
經(jīng)過艱苦卓絕的戰(zhàn)斗,終于有了一筆錢,現(xiàn)在我打算配置好的游戲裝備,我現(xiàn)在有了一個(gè)槍柜,它可以存放三層的槍械,每一層都可以放多把武器(這個(gè)就是二維數(shù)組,有多層,每層都是一個(gè)一維數(shù)組)
隨著游戲時(shí)長(zhǎng)和我的高超技術(shù),獲取游戲裝備的效率越來越高了,一個(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è)二維表,行*列組成的二維表,只不過這個(gè)二維表,每一行的列數(shù)還可能不同。但是每一個(gè)單元格中的元素的數(shù)據(jù)類型是一致的,例如:都是int,都是String等
二維數(shù)組的標(biāo)記: [][]
聲明一個(gè)二維數(shù)組
int[][] arr;
語法格式
//推薦 元素的數(shù)據(jù)類型[][] 二維數(shù)組的名稱; //不推薦 元素的數(shù)據(jù)類型 二維數(shù)組名[][]; //不推薦 元素的數(shù)據(jù)類型[] 二數(shù)組名
照例,我把一些不推薦但是不會(huì)造成編譯異常的寫法放上,因?yàn)橛械拿嬖囶}會(huì)遇到,有印象就好
初始化如同一維數(shù)組一樣,同樣有兩種方法
//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)化寫法 元素的數(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ù)組, * 分別來自,中國(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]); } }
動(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一共二維表有幾行 n:表示每一個(gè)一維數(shù)組的元素有多少個(gè)?;蛘哒f每一行共有一個(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)值了,沒有new的行還是null //(3)再為元素賦值 二維數(shù)組名[行下標(biāo)][列下標(biāo)] = 值;
不規(guī)則二維表,聲明后,初始話內(nèi)部一維數(shù)組時(shí)不能簡(jiǎn)寫
// 不規(guī)則二維表 // 定義二維數(shù)組 int[][] arr = new int[3][]; // 3行,未知的列 // 初始化二維數(shù)組內(nèi)的元素值 arr[0] = new int[]{1}; // 此處不能簡(jiǎn)寫為 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ù)組的槍柜, * 它存放了三層槍械, * 第一層存放的是狙擊槍,第二層存放的是步槍,第三層存放的是輔助武器 * 我買了這個(gè)槍柜,但并不是每一層存放的槍械數(shù)量相等,因此,我需要?jiǎng)討B(tài)初始化這個(gè)槍柜(數(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ù),由{}的元素個(gè)數(shù)決定
二維數(shù)組的遍歷,同一維數(shù)組一樣,區(qū)別就是,我們首先在外循環(huán),遍歷每一個(gè)一維數(shù)組,內(nèi)循環(huán)中的 I 就是每一個(gè)一維數(shù)組的內(nèi)存?zhèn)蔚刂?/p>
格式
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)存圖中的流程,如下圖:
流程步驟:
1.首先創(chuàng)建main方法,這個(gè)main方法會(huì)存在棧內(nèi)存中,(這個(gè)內(nè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)存開辟一個(gè)空間,左邊的是二維數(shù)組,因?yàn)榇鎯?chǔ)了三個(gè)一維數(shù)組,因此,它有三個(gè)元素,右邊分別開辟三個(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ù)組越界異常
示例代碼:
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,沒有3索引,因此我們不能訪問數(shù)組中不存在的索引,程序運(yùn)行后,將會(huì)拋出 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í)數(shù)組的每一行還未分配具體存儲(chǔ)元素的空間,此時(shí)arr[0]是null,此時(shí)訪問arr[0][0]會(huì)拋出NullPointerException 空指針異常。
上述內(nèi)容就是如何在Java中使用二維數(shù)組,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。