詳解Java中一維、二維數組在內存中的結構

前言

       我們知道在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 。這兩者的區別需要結合圖細細體會。

到此這篇關於詳解Java中一維、二維數組在內存中的結構的文章就介紹到這瞭,更多相關Java一維、二維數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: