前言
我們知道在Java中數(shù)組屬于引用數(shù)據(jù)類型,它整個數(shù)組的數(shù)組元素既可以是基本數(shù)據(jù)類型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 這些),也可以是引用數(shù)據(jù)類型的。當它的數(shù)組元素是基本數(shù)據(jù)類型時,這個數(shù)組就是一個一維數(shù)組;當它的數(shù)組元素是引用數(shù)據(jù)類型時,它就是一個多維數(shù)組。比如,在一個數(shù)組中它的某個元素值其實是一個一維數(shù)組,而其他不同的元素也各自包含了一個一維數(shù)組,我們就把這個包含很多個一維數(shù)組的數(shù)組叫做二維數(shù)組。
1、內(nèi)存中的簡化結(jié)構(gòu)
內(nèi)存也叫做主存,它是計算機五大部件(輸入設(shè)備、輸出設(shè)備、運算器、控制器、存儲器)中存儲器的一部分。在Java中我們可以簡單的將 內(nèi)存分為棧、堆和方法區(qū)三部分,其中方法區(qū)又包含了常量池和靜態(tài)域。如下圖所示,下面來解釋一下這三部分的作用:
棧 屬于線性表中的一種,它 具有先進后出的性質(zhì),在 Java 中我們 用來存放局部變量,如某方法里的數(shù)組名。
堆 它存放的東西其長度、類型不一定相等,一般存放的都是 new 出來的結(jié)構(gòu),像數(shù)組、對象這些。
方法區(qū) 可以存放各種我們自定義的方法。
![](/d/20211017/4f74801c963974dd082c51e983bffa51.gif)
內(nèi)存的簡單結(jié)構(gòu)
2、一維數(shù)組
下面我們來通過代碼了解一下,一維數(shù)組在內(nèi)存中的表現(xiàn)形式。我們先定義一個ArrayTest類。
public class ArrayTest{
public static void main(String[] args){
//定義三個數(shù)組 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];
}
}
上面的代碼中,我們定義了三個數(shù)組 a[ ]、b[ ]、c[ ] 就相當于 在堆開辟了三個各自連續(xù)的空間作為數(shù)組,如果指定了數(shù)組元素的值,則存放的是各個指定的值。如果沒有指定,則存放的是默認該數(shù)組類型的初始化值,如 b[ ] 。然后會 在棧里依次定義三個變量 a、b、c ,三個變量存放的是各自對應(yīng)的數(shù)組的地址值,如 a 存放的是 0x1234,而堆里該數(shù)組的地址是 0x11234 。
給元素賦值的話就相當于用我們指定的值覆蓋原有的值。下面我們來重點看一下這一句:
原本棧中的 c 變量存放的地址是 0x12ab 的,指向綠色的數(shù)組,但是我們 使用了這句話就相當于在堆中又重新開辟了一個數(shù)組,并將這個數(shù)組的地址賦給了變量 c ,也就是說** c 這個時候的指向變量,不再指向原來的數(shù)組了,而是指向了新的數(shù)組**。而沒有變量指向的原有數(shù)組會被 Java 自動回收。這就是一維數(shù)組在內(nèi)存中的表現(xiàn)形式。那么二維數(shù)組在內(nèi)存中又是如何表示的呢?
![](/d/20211017/09619a6142b78d6c0a91f953a64ccd4a.gif)
一維數(shù)組在內(nèi)存中的表現(xiàn)形式
3、二維數(shù)組
其實 在底層中并沒有二維數(shù)組這個概念,我們知道數(shù)組是引用數(shù)據(jù)類型,其元素值可以是基本數(shù)據(jù)類型,又可以是引用數(shù)據(jù)類型。所謂的 二維數(shù)組其實就相當于我們在內(nèi)存中開辟了一個數(shù)組空間,只不過它的那個元素各自指向一個數(shù)組 。
下面我們來舉個例子:
public class ArrayTest2{
public static void main(String[] args){
int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} };
//這個是二維數(shù)組的長度
System.out.println(arr1.length);
//這個是二維數(shù)組中的某個元素所指向的數(shù)組的長度
System.out.println(arr1[2].length);
}
}
上面的代碼中,我們定義了一個二維數(shù)組 arr1[ ][ ],并給它初始化了。就相當于我們在堆中開辟了四個一維數(shù)組,其中一個一維數(shù)組用來存放二維數(shù)組的元素,然后由二維數(shù)組的元素各自指向一個一維數(shù)組。棧中定義了一個變量 arr1 ,存放的是該二維數(shù)組的地址,如下圖所示。
二維數(shù)組在內(nèi)存中的表現(xiàn)形式
可以看到我們定義的二維數(shù)組 arr1[3][0] 其實存放的都是各自元素所指向的元素的地址值。而在棧中存放的則是該數(shù)組的地址值。
好了,知道了二維數(shù)組在內(nèi)存的結(jié)構(gòu),我們便可以知道下面兩句代碼的值:
//這個是二維數(shù)組的長度
System.out.println(arr1.length);
//這個是二維數(shù)組中的某個元素所指向的數(shù)組的長度
System.out.println(arr1[2].length);
}
}
其中 arr1.length 所指的就是二維數(shù)組的長度,那么二維數(shù)組的長度是多少呢?答案是 3 。而 arr1[2].length 所指的是該二維數(shù)組中第 3 個元素所指向的數(shù)組的長度,因此它的值是 4 。這兩者的區(qū)別需要結(jié)合圖細細體會。
到此這篇關(guān)于詳解Java中一維、二維數(shù)組在內(nèi)存中的結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Java一維、二維數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python爬蟲 批量爬取下載抖音視頻代碼實例
- Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻
- Python實現(xiàn)爬蟲從網(wǎng)絡(luò)上下載文檔的實例代碼
- Python爬蟲獲取圖片并下載保存至本地的實例
- Python3.x爬蟲下載網(wǎng)頁圖片的實例講解
- Python 給我一個鏈接 西瓜視頻隨便下載 爬蟲