多維數組,指二維以及二維以上的數組。二維數組有兩個層次,三維數組有三個層次,依次類推。每個層次對應一個下標。
在學校裡,由於一個班的人數不多,所以按照順序編號即可,當人數增多時,例如對於學校裡的人,在編號時就要增加層次,例如XX班XX號。在部隊中也是這樣,XX師XX團XX營XX連XX排XX班,這裡的層次就比較深了。為了管理數據的方便,一般要加深管理的層次,這就是多維數組的由來。
在實際使用中,為了使結構清晰,一般對於復雜的數據都是用多維數組。
關於多維數組的理解,最終的是理解數組的數組這個概念,因為數組本身就是一種復合數據類型,所以數組也可以作為數組元素存在。這樣二維數組就可以理解成內部每個元素都是一維數組類型的一個一維數組。三維數組可以理解成一個一維數組,內部的每個元素都是二維數組。無論在邏輯上還是語法上都支持“數組的數組”這種理解方式。
通常情況下,一般用二維數組的第一維代表行,第二維代表列,這種邏輯結構和現實中的結構一致。和一維數組類似,因為多維數組有多個下標,那麼引用數組中的元素時,需要指定多個下標。
一、多維數組語法
下面以二維數組為例,來介紹多維數組的語法。
1、維數組聲明
多維數組的聲明:
數據類型[][] 數組名稱;
數據類型[] 數組名稱[];
數據類型 數組名稱[][];
以上三種語法在聲明二維數組時的功能是等價的。同理,聲明三維數組時需要三對中括號,中括號的位置可以在數據類型的後面,也可以在數組名稱的後面,其它的依次類推。
例如:
- int[][] map;
- char c[][];
和一維數組一樣,數組聲明以後在內存中沒有分配具體的存儲空間,也沒有設定數組的長度。
2 、多維數組初始化
和一維數組一樣,多維數組的初始化也可以分為靜態初始化(整體賦值)和動態初始化兩種,其語法格式如下。
(1)靜態初始化
以二維數組的靜態初始化為例,來說明多維數組靜態初始化的語法格式。示例代碼如下:
- int[][] m = {
- {1,2,3},
- {2,3,4}
- };
在二維數組靜態初始化時,也必須和數組的聲明寫在一起。數值書寫時,使用兩個大括號嵌套實現,在最裡層的大括號內部書寫數字的值。數值和數值之間使用逗號分隔,內部的大括號之間也使用逗號分隔。
由該語法可以看出,內部的大括號其實就是一個一維數組的靜態初始化,二維數組只是把多個一維數組的靜態初始化組合起來。
同理,三維數組的靜態初始化語法格式如下:
- int[][][] b = {
- {
- {1,2,3},
- {1,2,3}
- },
- {
- {3,4,1},
- {2,3,4}
- }
- };
說明:這裡只是演示語法格式,數值本身沒有意義。
(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]。
3、用數組元素
對於二維數組來說,由於其有兩個下標,所以引用數組元素值的格式為:
數組名稱[第一維下標][第二維下標]
該表達式的類型和聲明數組時的數據類型相同。例如引用二維數組m中的元素時,使用m[0][0]引用數組中第一維下標是0,第二維下標也是0的元素。這裡第一維下標的區間是0到第一維的長度減1,第二維下標的區間是0到第二維的長度減1。
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中總的元素個數。