Java基礎(chǔ)知識精通數(shù)組的內(nèi)存分析
前言:本文章主要講解數(shù)組的內(nèi)存圖,更好地掌握數(shù)組以及數(shù)組調(diào)用流程,話不多說開講。
1.數(shù)組內(nèi)存圖
1.一個數(shù)組的內(nèi)存圖
int[] arr = new int[3]; //剛開始定義數(shù)組arr為int型包含三位數(shù)字,初始化為0,0,0. arr[0] = 12; //數(shù)組arr第一位被賦值12 arr[2] = 14; //數(shù)組arr第三位被賦值14 System.out.println(arr[0]); //12 System.out.println(arr[1]); //0 System.out.println(arr[2]); //14 System.out.println(arr); //[I@7852e922
解釋
如下圖:棧相當于存放數(shù)組變量的地址,堆相當于存放數(shù)組里面的元素而他們的下標就相當于房間號。
在這里我臨時定義arr的地址是0x001等同于[I@7852e922。
下面我開始介紹一下數(shù)組的調(diào)用流程 :
- 第一步剛開始定義arr為int型數(shù)組變量放在棧里,數(shù)組里面的三個元素放在堆里并初始化為0,0,0。
- 第二步分別把12,14賦值給arr[0],arr[2]。所以我們根據(jù)棧的地址0x001去堆里找到相應的地址,找到房間號0、2并把12、14放到相應的房間號。這樣數(shù)組第一位為12,第三位為14。
- 第三步輸出數(shù)組元素以及數(shù)組的地址。這個就很簡單啦!從棧里找到數(shù)組arr的地址去堆里調(diào)用相應數(shù)組的元素。
調(diào)用完成之后,棧和堆里的數(shù)據(jù)就會消失。
看懂了一個數(shù)組內(nèi)存圖,下面幾個就會看懂啦。

2.兩個數(shù)組的內(nèi)存圖
int[] arr1 = new int[]{23,12,5}; //一開始就初始化為23、12、5。
System.out.println(arr1[0]); //23
System.out.println(arr1[1]); //12
System.out.println(arr1[2]); //5
System.out.println(arr1); //0x001
arr1[0] = 13; //把13賦值給arr1第一位。
System.out.println(arr1[0]); //13
int[] arr2 = {14,18,15}; //與上面同理
System.out.println(arr2[0]); //14
System.out.println(arr2[1]); //18
System.out.println(arr2[2]); //15
System.out.println(arr2); //0x002
arr2[1] = 12; //賦值給arr2第二位為12
System.out.println(arr2[1]); //12
- 這個與第一個數(shù)組不同的是數(shù)組里面的元素全部被初始化賦值。
- 流程都一樣,都是先通過棧找到數(shù)組地址根據(jù)地址去堆尋找相應數(shù)組元素。
- 當數(shù)組arr1運行完后會退出棧和堆,給arr2讓出內(nèi)存空間。也就是說arr1運行完后會消失于內(nèi)存,arr2數(shù)組進入內(nèi)存進行操作。
- 這兩個數(shù)組的地址不一樣。

3.一個變量兩個數(shù)組容器的內(nèi)存圖
int[] arr = new int[3]; //定義一個int型的arr數(shù)組,包含三個元素初始化為0。 System.out.println(arr[0]); // 0 arr[0] = 3; System.out.println(arr[0]); //3 System.out.println(arr); //0x001 arr = new int[5]; //重新賦值int型的arr數(shù)組,包含5個元素初始化為0,并且數(shù)組地址也相應改變。 System.out.println(arr[0]); // 0 arr[0] = 5; System.out.println(arr[0]); // 5 System.out.println(arr); //0x002 如果不明白看下圖
- 這個與其他兩個案例不同的是把兩個數(shù)組都指向同一個變量,這就相當于往同一個杯子先放入清水然后把水喝光再放入飲料。
- 這兩個數(shù)組跟杯子是同一個道理,當arr =new int[3]執(zhí)行完后會被 new int[5]數(shù)組元素所覆蓋。所有的數(shù)組元素和地址會改變。
- 執(zhí)行流程跟我講的第一個案例一樣。

4.兩個變量指向一個數(shù)組容器的內(nèi)存圖
int[] arr1 = new int[3]; //定義一個int型的arr數(shù)組,包含三個元素初始化為0。 System.out.println(arr1[0]); //0 arr1[0] = 12; System.out.println(arr1[0]); //12 System.out.println(arr1); //0x001 int[] arr2 = arr1; //把arr1變量賦值給arr2 System.out.println(arr2[0]); //12 arr2[0] = 13; System.out.println(arr2[0]); //13 System.out.println(arr2); //0x001 System.out.println(arr1[0]); //13
- 這個案例與上一個案例不同的是這個案例是兩個變量指向同一個數(shù)組,就相當于原本給你發(fā)順豐快遞,后來給你改發(fā)為圓通快遞,但是收件人依舊是你,地址也不會發(fā)生改變。
- 所以arr1賦值給arr2,里面的元素與數(shù)組地址都不會改變。
- 最后程序輸出arr1[0]的值實際上是arr2[0]的值。

相關(guān)文章
Spring4下validation數(shù)據(jù)校驗無效(maven)的解決
這篇文章主要介紹了Spring4下validation數(shù)據(jù)校驗無效(maven)的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot配置數(shù)據(jù)庫密碼加密的方法
由于系統(tǒng)安全的考慮,配置文件中不能出現(xiàn)明文密碼的問題,本文就給大家詳細介紹下springboot配置數(shù)據(jù)庫密碼加密的方法,下面話不多說了,來一起看看詳細的介紹吧,需要的朋友可以參考下2023-08-08
mybatis中<if>標簽bool值類型為false判斷方法
這篇文章主要給大家介紹了關(guān)于mybatis中<if>標簽bool值類型為false判斷方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mybatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-08-08
基于java file 文件操作operate file of java的應用
本篇文章介紹了,基于java file 文件操作operate file of java的應用。需要的朋友參考下2013-05-05
SpringBoot?Security從入門到實戰(zhàn)示例教程
Spring?Security是一個功能強大且高度可定制的身份驗證和訪問控制框架,接下來通過本文給大家介紹SpringBoot?Security從入門到實戰(zhàn)示例教程,感興趣的朋友一起看看吧2022-05-05
Java的Spring框架中bean的繼承與內(nèi)部bean的注入
這篇文章主要介紹了Java的Spring框架中bean的繼承與內(nèi)部bean的注入,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
Springboot配置security basic path無效解決方案
這篇文章主要介紹了Springboot配置security basic path無效解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09

