前面我們學習的數組基本是基於一維數組來操作的,這一切我們就簡單的看一下二維數組。
二維數組,我們通俗點可以說成是數組中的數組,就是說我們可以把一個二維數組理解爲一個元素爲一維數組的一維數組。
二維數組的定義格式以下兩種格式:
格式一:
int[][] arr = new int[3][2];//定義了一個名爲arr的二維數組,該二維數組中有3個一維數組,每一個一維數組中有2個元素
格式二:
int[][] arr = new int[3][];//這個沒有明確一維數組的長度
我們看看這兩種格式的不同之處,先看一段測試代碼:
class Array2Demo
{
public static void main(String[] args)
{
int[][] arr = new int[3][2];//定義一個名爲arr的二維數組
System.out.println(arr);//直接打印二維數組 結果[[I@139a55,這是二維數組的地址
System.out.println(arr[0]);//直接打印二維數組中的索引0的一維數組 結果[I@1db9742,這是二維數組中索引0的一維數組的地址
System.out.println(arr[0][0]);//直接打印二維數組中索引0的一維數組索引0的元素 結果0,元素默認初始化爲0
int[][] arr2 = new int[3][];//沒有明確一維數組的長度
//分別對二維數組中的每一個一維數組進行初始化
//arr2[0] = new int[2];
//arr2[1] = new int[1];
//arr2[2] = new int[3];
System.out.println(arr2);//直接打印二維數組 結果[[I@106d69c,這是二維數組的地址
System.out.println(arr2[0]);//直接打印二維數組中的索引0的一維數組 結果null,這是二維數組中索引0的一維數組沒有自動創建
//System.out.println(arr2[0][0]);//直接打印二維數組中索引0的一維數組索引0的元素 結果 NullPointerExcption
int[][] arr3 = new int[3][2];
System.out.println(arr3.length);//打印二維數組的長度,其實就是一維數組的個數.
System.out.println(arr3[1].length);//打印二維數組中索引爲1的一維數組的長度.
}
}
結果:
從結果我們可以看兩種格式定義的二維數組打印數組會返回的都是數組的地址,從而我們進一步分析內在存儲爲:
對於第一種格式,當運行時,先把arr變量存入棧中,然後在堆內存中爲二維數組(實體)創建空間,並把數組的地址存入arr變量中,然後對每二維數組的每一個一維數組在堆內存中創建不同的空間,再分別把一維數組的地址存入一維數組中,最後對每一個一維數組的每一個元素進行默認初始化爲0.
而對於第二種格式來說,對二維數組中的每一個一維數組都要進行初始化,當然對於這些數組初始化的大小可以不一樣,也就是第二種格式比第一種格式相對來說要靈活。如果我們不對一維數組進行初始化,就會出現上面代碼中運行的結果,打印二維數組的元素結果爲null,打印一維數組的元素就會拋出NullPointerExcption異常。
這裏我們知道第二種格式要比第一種格式定義的二維數組更靈活和實用。
前面我們學習了一維數組的幾種常用操作,這裏我們就只看一下二維數組的遍歷操作。
當我們對一個二維數組遍歷的時候,我們很自然想到的就是前面學習for語句時的一種現象,那就大圈套小圈,誠然,對於二維數組的很多操作,我們最常用的也就是這個原理,循環的嵌套,下面我們看下學習過程中編寫的遍歷方法和測試結果:
class Array2Demo
{
public static void main(String[] args)
{
int[][] arr4 = {{3,1,4},{2,5,8},{4,3,9}};
//如何遍歷該二維數組?
//我們獨立寫一個遍歷的方法吧
printArray2(arr4);//結果:{{3,1,4},{2,5,8},{4,3,9}}
}
//這個方法用來遍歷一個二維數組
public static void printArray2(int[][] arr)
{
System.out.print("{");
for(int i=0;i<arr.length;i++)//很明顯就是大圈套小圈的原理
{
System.out.print("{");
for(int j=0;j<arr[i].length;j++)
{
System.out.print(arr[i][j]);
if(j<arr[i].length-1)//判斷去除最後一個逗號
{
System.out.print(",");
}
}
System.out.print("}");
if(i<arr.length-1)//判斷去除最後一個逗號
{
System.out.print(",");
}
}
System.out.print("}");
}
}
結果: