欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)知識(shí)精通數(shù)組的內(nèi)存分析

 更新時(shí)間:2022年04月28日 15:41:57   作者:猿界的小皮皮  
數(shù)組對(duì)于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素

前言:本文章主要講解數(shù)組的內(nèi)存圖,更好地掌握數(shù)組以及數(shù)組調(diào)用流程,話不多說開講。

1.數(shù)組內(nèi)存圖

1.一個(gè)數(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

解釋

如下圖:棧相當(dāng)于存放數(shù)組變量的地址,堆相當(dāng)于存放數(shù)組里面的元素而他們的下標(biāo)就相當(dāng)于房間號(hào)。

在這里我臨時(shí)定義arr的地址是0x001等同于[I@7852e922。

下面我開始介紹一下數(shù)組的調(diào)用流程 :

  • 第一步剛開始定義arr為int型數(shù)組變量放在棧里,數(shù)組里面的三個(gè)元素放在堆里并初始化為0,0,0。
  • 第二步分別把12,14賦值給arr[0],arr[2]。所以我們根據(jù)棧的地址0x001去堆里找到相應(yīng)的地址,找到房間號(hào)0、2并把12、14放到相應(yīng)的房間號(hào)。這樣數(shù)組第一位為12,第三位為14。
  • 第三步輸出數(shù)組元素以及數(shù)組的地址。這個(gè)就很簡單啦!從棧里找到數(shù)組arr的地址去堆里調(diào)用相應(yīng)數(shù)組的元素。

調(diào)用完成之后,棧和堆里的數(shù)據(jù)就會(huì)消失。

看懂了一個(gè)數(shù)組內(nèi)存圖,下面幾個(gè)就會(huì)看懂啦。

2.兩個(gè)數(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
  • 這個(gè)與第一個(gè)數(shù)組不同的是數(shù)組里面的元素全部被初始化賦值。
  • 流程都一樣,都是先通過棧找到數(shù)組地址根據(jù)地址去堆尋找相應(yīng)數(shù)組元素。
  • 當(dāng)數(shù)組arr1運(yùn)行完后會(huì)退出棧和堆,給arr2讓出內(nèi)存空間。也就是說arr1運(yùn)行完后會(huì)消失于內(nèi)存,arr2數(shù)組進(jìn)入內(nèi)存進(jìn)行操作。
  • 這兩個(gè)數(shù)組的地址不一樣。

3.一個(gè)變量兩個(gè)數(shù)組容器的內(nèi)存圖

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

4.兩個(gè)變量指向一個(gè)數(shù)組容器的內(nèi)存圖

int[] arr1 = new int[3];		//定義一個(gè)int型的arr數(shù)組,包含三個(gè)元素初始化為0。
System.out.println(arr1[0]);	//0
arr1[0] = 12;
System.out.println(arr1[0]);	//12
System.out.println(arr1);		//0x001
int[] arr2 = arr1;				//把a(bǔ)rr1變量賦值給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
  • 這個(gè)案例與上一個(gè)案例不同的是這個(gè)案例是兩個(gè)變量指向同一個(gè)數(shù)組,就相當(dāng)于原本給你發(fā)順豐快遞,后來給你改發(fā)為圓通快遞,但是收件人依舊是你,地址也不會(huì)發(fā)生改變。
  • 所以arr1賦值給arr2,里面的元素與數(shù)組地址都不會(huì)改變。
  • 最后程序輸出arr1[0]的值實(shí)際上是arr2[0]的值。

相關(guān)文章

  • Java 實(shí)現(xiàn)圖片壓縮的兩種方法

    Java 實(shí)現(xiàn)圖片壓縮的兩種方法

    這篇文章主要介紹了Java 實(shí)現(xiàn)圖片壓縮的兩種方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • java解析xml之sax解析xml示例分享

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次讀取XML文件中根據(jù)讀取的數(shù)據(jù)產(chǎn)生相應(yīng)的事件,由應(yīng)用程序?qū)崿F(xiàn)相應(yīng)的事件處理邏輯,即它是一種“推”的解析方式;這種解析方法速度快、占用內(nèi)存少,但是它需要應(yīng)用程序自己處理解析器的狀態(tài),實(shí)現(xiàn)起來會(huì)比較麻煩
    2014-01-01
  • Spring4下validation數(shù)據(jù)校驗(yàn)無效(maven)的解決

    Spring4下validation數(shù)據(jù)校驗(yàn)無效(maven)的解決

    這篇文章主要介紹了Spring4下validation數(shù)據(jù)校驗(yàn)無效(maven)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot配置數(shù)據(jù)庫密碼加密的方法

    SpringBoot配置數(shù)據(jù)庫密碼加密的方法

    由于系統(tǒng)安全的考慮,配置文件中不能出現(xiàn)明文密碼的問題,本文就給大家詳細(xì)介紹下springboot配置數(shù)據(jù)庫密碼加密的方法,下面話不多說了,來一起看看詳細(xì)的介紹吧,需要的朋友可以參考下
    2023-08-08
  • mybatis中<if>標(biāo)簽bool值類型為false判斷方法

    mybatis中<if>標(biāo)簽bool值類型為false判斷方法

    這篇文章主要給大家介紹了關(guān)于mybatis中<if>標(biāo)簽bool值類型為false判斷方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 基于java file 文件操作operate file of java的應(yīng)用

    基于java file 文件操作operate file of java的應(yīng)用

    本篇文章介紹了,基于java file 文件操作operate file of java的應(yīng)用。需要的朋友參考下
    2013-05-05
  • SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程

    SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程

    Spring?Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,接下來通過本文給大家介紹SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程,感興趣的朋友一起看看吧
    2022-05-05
  • Java的Spring框架中bean的繼承與內(nèi)部bean的注入

    Java的Spring框架中bean的繼承與內(nèi)部bean的注入

    這篇文章主要介紹了Java的Spring框架中bean的繼承與內(nèi)部bean的注入,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 淺析Java中ConcurrentHashMap的存儲(chǔ)流程

    淺析Java中ConcurrentHashMap的存儲(chǔ)流程

    ConcurrentHashMap技術(shù)在互聯(lián)網(wǎng)技術(shù)使用如此廣泛,幾乎所有的后端技術(shù)面試官都要在ConcurrentHashMap技術(shù)的使用和原理方面對(duì)小伙伴們進(jìn)行360°的刁難,本文詳細(xì)給大家介紹一下ConcurrentHashMap的存儲(chǔ)流程,需要的朋友可以參考下
    2023-05-05
  • Springboot配置security basic path無效解決方案

    Springboot配置security basic path無效解決方案

    這篇文章主要介紹了Springboot配置security basic path無效解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論