前言
我們知道在Java中陣列屬于參考資料型別,它整個陣列的陣列元素既可以是基本資料型別的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 這些),也可以是參考資料型別的,當它的陣列元素是基本資料型別時,這個陣列就是一個一維陣列;當它的陣列元素是參考資料型別時,它就是一個多維陣列,比如,在一個陣列中它的某個元素值其實是一個一維陣列,而其他不同的元素也各自包含了一個一維陣列,我們就把這個包含很多個一維陣列的陣列叫做二維陣列,
1、記憶體中的簡化結構
記憶體也叫做主存,它是計算機五大部件(輸入設備、輸出設備、運算器、控制器、存盤器)中存盤器的一部分,在Java中我們可以簡單的將 記憶體分為堆疊、堆和方法區三部分,其中方法區又包含了常量池和靜態域,如下圖所示,下面來解釋一下這三部分的作用:
堆疊 屬于線性表中的一種,它 具有先進后出的性質,在 Java 中我們 用來存放區域變數,如某方法里的陣列名,
堆 它存放的東西其長度、型別不一定相等,一般存放的都是 new 出來的結構,像陣列、物件這些,
方法區 可以存放各種我們自定義的方法,

記憶體的簡單結構
2、一維陣列
下面我們來通過代碼了解一下,一維陣列在記憶體中的表現形式,我們先定義一個ArrayTest類,
public class ArrayTest{
public static void main(String[] args){
//定義三個陣列 a[]、b[]、c[]
int[] a = new int[]{1,2,3};
float[] b = new float[3];
String[] c = new String[4];
//給特定元素賦值
c[1] = "張三";
c[2] = "李四";
//改變變數指向
c = new String[2];
}
}
上面的代碼中,我們定義了三個陣列 a[ ]、b[ ]、c[ ] 就相當于 在堆開辟了三個各自連續的空間作為陣列,如果指定了陣列元素的值,則存放的是各個指定的值,如果沒有指定,則存放的是默認該陣列型別的初始化值,如 b[ ] ,然后會 在堆疊里依次定義三個變數 a、b、c ,三個變數存放的是各自對應的陣列的地址值,如 a 存放的是 0x1234,而堆里該陣列的地址是 0x11234 ,
給元素賦值的話就相當于用我們指定的值覆寫原有的值,下面我們來重點看一下這一句:
c = new String[2];
原本堆疊中的 c 變數存放的地址是 0x12ab 的,指向綠色的陣列,但是我們 使用了這句話就相當于在堆中又重新開辟了一個陣列,并將這個陣列的地址賦給了變數 c ,也就是說** c 這個時候的指向變數,不再指向原來的陣列了,而是指向了新的陣列**,而沒有變數指向的原有陣列會被 Java 自動回收,這就是一維陣列在記憶體中的表現形式,那么二維陣列在記憶體中又是如何表示的呢?

一維陣列在記憶體中的表現形式
3、二維陣列
其實 在底層中并沒有二維陣列這個概念,我們知道陣列是參考資料型別,其元素值可以是基本資料型別,又可以是參考資料型別,所謂的 二維陣列其實就相當于我們在記憶體中開辟了一個陣列空間,只不過它的那個元素各自指向一個陣列 ,
下面我們來舉個例子:
public class ArrayTest2{
public static void main(String[] args){
int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} };
//這個是二維陣列的長度
System.out.println(arr1.length);
//這個是二維陣列中的某個元素所指向的陣列的長度
System.out.println(arr1[2].length);
}
}
上面的代碼中,我們定義了一個二維陣列 arr1[ ][ ],并給它初始化了,就相當于我們在堆中開辟了四個一維陣列,其中一個一維陣列用來存放二維陣列的元素,然后由二維陣列的元素各自指向一個一維陣列,堆疊中定義了一個變數 arr1 ,存放的是該二維陣列的地址,如下圖所示,

二維陣列在記憶體中的表現形式
可以看到我們定義的二維陣列 arr1[3][0] 其實存放的都是各自元素所指向的元素的地址值,而在堆疊中存放的則是該陣列的地址值,
好了,知道了二維陣列在記憶體的結構,我們便可以知道下面兩句代碼的值:
//這個是二維陣列的長度
System.out.println(arr1.length);
//這個是二維陣列中的某個元素所指向的陣列的長度
System.out.println(arr1[2].length);
}
}
其中 arr1.length 所指的就是二維陣列的長度,那么二維陣列的長度是多少呢?答案是 3 ,而 arr1[2].length 所指的是該二維陣列中第 3 個元素所指向的陣列的長度,因此它的值是 4 ,這兩者的區別需要結合圖細細體會,
以上筆記是在學習程序中個人覺得比較重要的點,記錄下來,供大家學習交流使用,如有錯誤,歡迎指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258707.html
標籤:java
