## Java編程那些事兒48—多維數組基礎
鄭州游戲學院 陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
**6.4 多維數組基礎**
在學校里,由于一個班的人數不多,所以按照順序編號即可,當人數增多時,例如對于學校里的人,在編號時就要增加層次,例如XX班XX號。在部隊中也是這樣,XX師XX團XX營XX連XX排XX班,這里的層次就比較深了。為了管理數據的方便,一般要加深管理的層次,這就是多維數組的由來。
多維數組,指二維以及二維以上的數組。二維數組有兩個層次,三維數組有三個層次,依次類推。每個層次對應一個下標。
在實際使用中,為了使結構清晰,一般對于復雜的數據都是用多維數組。
關于多維數組的理解,最終的是理解數組的數組這個概念,因為數組本身就是一種復合數據類型,所以數組也可以作為數組元素存在。這樣二維數組就可以理解成內部每個元素都是一維數組類型的一個一維數組。三維數組可以理解成一個一維數組,內部的每個元素都是二維數組。無論在邏輯上還是語法上都支持“數組的數組”這種理解方式。
通常情況下,一般用二維數組的第一維代表行,第二維代表列,這種邏輯結構和現實中的結構一致。
和一維數組類似,因為多維數組有多個下標,那么引用數組中的元素時,需要指定多個下標。
**6.5 多維數組語法**
下面以二維數組為例,來介紹多維數組的語法。
**6.5.1 多維數組聲明**
多維數組的聲明:
?????????????????? 數據類型[][] 數組名稱;
?????????????????? 數據類型[]?數組名稱[];
?????????????????? 數據類型?? 數組名稱[][];
以上三種語法在聲明二維數組時的功能是等價的。同理,聲明三維數組時需要三對中括號,中括號的位置可以在數據類型的后面,也可以在數組名稱的后面,其它的依次類推。
例如:
?????????????????? int[][] map;
?????????????????? char c[][];
和一維數組一樣,數組聲明以后在內存中沒有分配具體的存儲空間,也沒有設定數組的長度。
**6.5.2 多維數組初始化**
和一維數組一樣,多維數組的初始化也可以分為靜態初始化(整體賦值)和動態初始化兩種,其語法格式如下。
**6.5.2.1 靜態初始化**
以二維數組的靜態初始化為例,來說明多維數組靜態初始化的語法格式。示例代碼如下:
~~~
?????????????????? int[][] m = {
??????????????????????????? {1,2,3},
??????????????????????????? {2,3,4}
?????????????????? };
~~~
在二維數組靜態初始化時,也必須和數組的聲明寫在一起。數值書寫時,使用兩個大括號嵌套實現,在最里層的大括號內部書寫數字的值。數值和數值之間使用逗號分隔,內部的大括號之間也使用逗號分隔。
由該語法可以看出,內部的大括號其實就是一個一維數組的靜態初始化,二維數組只是把多個一維數組的靜態初始化組合起來。
同理,三維數組的靜態初始化語法格式如下:
~~~
?????????????????? int[][][] b = {
??????????????????????????? {
???????????????????????????????????? {1,2,3},
???????????????????????????????????? {1,2,3}
??????????????????????????? },
??????????????????????????? {
???????????????????????????????????? {3,4,1},
???????????????????????????????????? {2,3,4}
??????????????????????????? }
?????????????????? };
~~~
說明:這里只是演示語法格式,數值本身沒有意義。
**6.5.2.2 動態初始化**
二維數組動態初始化的語法格式:
?????????????????? 數據類型[][] 數組名稱 = new 數據類型[第一維的長度][第二維的長度];
?????????????????? 數據類型[][] 數組名稱;
?????????????????? 數組名稱 = new 數據類型[第一維的長度][第二維的長度];
???????? 示例代碼:
?????????????????? byte[][] b = new byte[2][3];
?????????????????? int m[][];
m = new int[4][4];
和一維數組一樣,動態初始化可以和數組的聲明分開,動態初始化只指定數組的長度,數組中每個元素的初始化是數組聲明時數據類型的默認值。例如上面初始化了長度為2X3的數組b,和4X4的數組m。
使用這種方法,初始化出的第二維的長度都是相同的,如果需要初始化第二維長度不一樣的二維數組,則可以使用如下的格式:
~~~
?????????????????? int n[][];
?????????????????? n = new int[2][];?//只初始化第一維的長度
?????????????????? //分別初始化后續的元素
?????????????????? n[0] = new int[4];
?????????????????? n[1] = new int[3];
~~~
這里的語法就體現了數組的數組概念,在初始化第一維的長度時,其實就是把數組n看成了一個一維數組,初始化其長度為2,則數組n中包含的2個元素分別是n[0]和n[1],而這兩個元素分別是一個一維數組。后面使用一維數組動態初始化的語法分別初始化n[0]和n[1]。
**6.5.3 引用數組元素**
對于二維數組來說,由于其有兩個下標,所以引用數組元素值的格式為:
數組名稱[第一維下標][第二維下標]
該表達式的類型和聲明數組時的數據類型相同。例如引用二維數組m中的元素時,使用m[0][0]引用數組中第一維下標是0,第二維下標也是0的元素。這里第一維下標的區間是0到第一維的長度減1,第二維下標的區間是0到第二維的長度減1。
**6.5.4 獲得數組長度**
對于多維數組來說,也可以獲得數組的長度。但是使用數組名.length獲得的是數組第一維的長度。如果需要獲得二維數組中總的元素個數,可以使用如下代碼:
~~~
?????????????????? int[][] m = {
??????????????????????????? {1,2,3,1},
??????????????????????????? {1,3},
??????????????????????????? {3,4,2}
?????????????????? };
?????????????????? int sum = 0;
?????????????????? for(int i = 0;i < m.length;i++){?//循環第一維下標
??????????????????????????? sum += m[i].length;???? //第二維的長度相加
?????????????????? }
~~~
在該代碼中,m.length代表m數組第一維的長度,內部的m[i]指每個一維數組元素,m[i].length是m[i]數組的長度,把這些長度相加就是數組m中總的元素個數。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結