最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單談談Java中的棧和堆

 更新時間:2021年11月23日 09:51:59   作者:巴黎愛工作  
堆和棧都是Java用來在RAM中存放數(shù)據(jù)的地方,下面這篇文章主要給大家介紹了關于Java中棧和堆的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

人們常說堆棧堆棧,堆和棧是內(nèi)存中兩處不一樣的地方,什么樣的數(shù)據(jù)存在棧,又是什么樣的數(shù)據(jù)存在堆中?

這里淺談Java中的棧和堆

首先,將結論寫在前面,后面再用例子加以驗證。

Java的棧中存儲以下類型數(shù)據(jù),棧對應的英文單詞是Stack

基本類型

引用類型變量

方法

棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。

棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和對象句柄。

棧有一個很重要的特殊性,就是存在棧中的數(shù)據(jù)可以共享。

Java的堆中存儲以下類型數(shù)據(jù),堆對應的英文單詞是Heap

實例對象

在函數(shù)中定義的一些基本類型的變量(8種)和對象的引用變量都是在函數(shù)的棧Stack內(nèi)存中分配。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內(nèi)存空間,當超過變量的作用域后,java會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立刻被另作他用。

堆Heap內(nèi)存用于存放由new創(chuàng)建的對象和數(shù)組。在堆中分配的內(nèi)存,由java虛擬機自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或者對象后,還可以在棧中定義一個特殊的變量,這個變量的取值等于數(shù)組或者對象在堆內(nèi)存中的首地址,在棧中的這個特殊的變量就變成了數(shù)組或者對象的引用變量,以后就可以在程序中使用棧內(nèi)存中的引用變量來訪問堆中的數(shù)組或者對象,引用變量相當于為數(shù)組或者對象起的一個別名,或者代號。

引用變量是普通變量,定義時在棧中分配內(nèi)存,引用變量在程序運行到作用域外釋放。而數(shù)組&對象本身在堆中分配,即使程序運行到使用new產(chǎn)生數(shù)組和對象的語句所在地代碼塊之外,數(shù)組和對象本身占用的堆內(nèi)存也不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內(nèi)存的主要原因,實際上,棧中的變量指向堆內(nèi)存中的變量,這就是 Java 中的指針!

class Person {
 
    int age;
 
}
 
 
public class LearnHeap {
 
 
    public static void main(String args[]){
 
        int a=10;
        Person person = new Person();
        person.age =20;
 
        change(a,person);
        System.out.println("a="+ a+",and person.age = "+person.age);
 
    }
 
    static void change(int a1, Person person){
 
        a1 = 11;
        person.age= 21;
        System.out.println("a1="+ a1+",and age1 = "+person);
 
    }
 
}

兩次的輸出結果是什么?猜測下。

以上程序內(nèi)存加載的執(zhí)行步驟:

第1步 —— main()函數(shù)是程序入口,JVM先執(zhí)行,首先將main方法壓入棧中,在棧內(nèi)存中開辟一個空間,存放int類型變量a,同時附值10。
在堆中分配一片區(qū)域,用來存放和創(chuàng)建Person對象,這片內(nèi)存區(qū)域會有屬于自己的內(nèi)存地址,假設是1001,然后給成員變量賦值,age=20
執(zhí)行結束后,構造防范弾棧,Person創(chuàng)建完成,將Person的內(nèi)存地址1001賦值給person(此處person小寫,是引用變量類型)

第2步 —— JVM執(zhí)行change()函數(shù),在棧內(nèi)存中又開辟一個新的空間,存放int類型變量a和對象Person中person
此時main空間與change空間并存,同時運行,互不影響。

第3步 —— change()方法執(zhí)行,將a賦值為11,person對象的堆中年齡age賦值為21

第4步 —— change()執(zhí)行完畢,變量a立即釋放,空間消失。但是main()函數(shù)空間仍存在,main中的變量a仍然存在,不受影響。而person在堆中對應的地址,所指的age已經(jīng)賦值=21

實際輸出如下:

結論:

如果a()方法中的基本類型(8個)變量x傳入b()方法中,并在b()中進行了修改,則a()方法中的x的值保持不變

如果a()方法中的引用類型 變量x傳入b()方法中,并在b()中進行了修改,則a()方法中的x的值與b()保持一致

下面對8中基本類型進行簡單的測試

package heapandStack;
 
public class LearnHeap02 {
 
    public static void main(String args[]){
 
 
        byte b=10;
        short s=20;
        int i=30;
        long l =40l;
 
        float f =12.34f;
        double d = 100.123d;
 
        char c = 'A';
        boolean flag = true;
 
        change(b,s,i,l,f,d,c,flag);
 
        System.out.println(b);
        System.out.println(s);
        System.out.println(i);
        System.out.println(l);
 
 
        System.out.println(f);
        System.out.println(d);
        System.out.println(c);
        System.out.println(flag);
 
    }
 
    static void change(byte a, short b, int c,long d, float f, double g, char h,boolean x){
 
        a =11;
        b=21;
        c =31;
        d =41l;
        f=12.99f;
        g= 200.123d;
        h ='V';
        x =false;
 
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
 
 
        System.out.println(f);
        System.out.println(g);
        System.out.println(h);
        System.out.println(x);
 
    }
}

下面測試一下數(shù)組,是不是屬于實例對象類型

public class LearnHeap03 {
 
    public static void main(String args[]){
 
     int a[] ={1,2,3};
     change(a);
        for(int i:a)
            System.out.print(i+" ");
 
    }
 
    static void change(int[] a){
        a[0]=4;
        a[1]=5;
        for(int i:a)
            System.out.print(i+" ");
        System.out.println("============ ");
 
    }
}

從結果看出,數(shù)組的值被改變了

Java種8種基本數(shù)據(jù)類型,并不包含String,String的值會被change函數(shù)改變嗎?String應該存在棧中,還是堆中呢?

先直接上測試代碼

public class Learn04 {
 
    public static void main(String args[]){
 
        String s1 = new String("abcd");
        String s2 = "asdfghjkl";
        System.out.println(s1+", "+s2);
        change(s1,s2);
        System.out.println(s1+", "+s2);
 
    }
 
    static void change(String s1,String s2){
        s1 ="123456";
        s2 ="000000";
        System.out.println(s1+", "+s2);
 
    }
}

兩種的形式來創(chuàng)建String,第一種是用new()來新建對象的,它會在存放于堆中。每調用一次就會創(chuàng)建一個新的對象。 而第二種是先在棧中創(chuàng)建一個對String類的對象引用變量s2,然后查找棧中有沒有存放"asdfghjkl",如果沒有,則將"asdfghjkl"存放進棧,并令str指 向”abc”,如果已經(jīng)有”asdfghjkl” 則直接令s2指向“asdfghjkl”?!?/p>

 

既然講到兩種形式創(chuàng)建String,下面講一個String兩種形式創(chuàng)建的區(qū)別,先看一段代碼

public class Learn05 {
 
    public static void main(String args[]){
 
        String s1 = new String("abcd");
        String s2 = "abcd";
        boolean a =s1.equals(s2);
        boolean b =(s1==s2);
 
        System.out.println(a);
        System.out.println(b);
 
        String s3 = "abcd";
        boolean a1 =s3.equals(s2);
        boolean b1 =(s3==s2);
 
        System.out.println(a1);
        System.out.println(b1);
 
 
    }
 
}

總結

到此這篇關于Java中的棧和堆的文章就介紹到這了,更多相關Java中棧和堆內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入了解Java包與訪問控制權限

    深入了解Java包與訪問控制權限

    這篇文章主要帶你掌握Java中包的定義及使用以及Java中的4種訪問權限,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-09-09
  • java重試機制使用RPC必須考慮冪等性原理解析

    java重試機制使用RPC必須考慮冪等性原理解析

    這篇文章主要為大家介紹了java重試機制使用RPC必須考慮冪等性原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 淺談Spring如何解決循環(huán)依賴的問題

    淺談Spring如何解決循環(huán)依賴的問題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • java多線程應用實現(xiàn)方法

    java多線程應用實現(xiàn)方法

    以前沒有寫筆記的習慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時總結是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油
    2012-11-11
  • JDK1.7的ConcurrentHashMap源碼解析

    JDK1.7的ConcurrentHashMap源碼解析

    這篇文章主要介紹了JDK1.7的ConcurrentHashMap源碼解析,HashMap是非線程安全的,而HashTable是線程安全的,但是HashTable實現(xiàn)同步的方法比較暴力,即在所有的方法體上添加synchronized關鍵字,需要的朋友可以參考下
    2023-12-12
  • Java算法之串的簡單處理

    Java算法之串的簡單處理

    今天小編就為大家分享一篇關于Java算法之串的簡單處理,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java中的break和continue關鍵字的使用方法總結

    Java中的break和continue關鍵字的使用方法總結

    下面小編就為大家?guī)硪黄狫ava中的break和continue關鍵字的使用方法總結。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • springboot @Valid注解對嵌套類型的校驗功能

    springboot @Valid注解對嵌套類型的校驗功能

    這篇文章主要介紹了springboot~@Valid注解對嵌套類型的校驗,主要介紹 @Valid在項目中的使用,需要的朋友可以參考下
    2018-05-05
  • IDEA中的打包Build Artifacts圖文詳解

    IDEA中的打包Build Artifacts圖文詳解

    當項目開發(fā)完畢,需要對外發(fā)布時,我們就會用到IDEABuild Artifacts功能,那么如果在idea中打包呢,這篇文章主要介紹了IDEA中的打包Build Artifacts詳解,需要的朋友可以參考下
    2024-03-03
  • SpringBoot 統(tǒng)一公共返回類的實現(xiàn)

    SpringBoot 統(tǒng)一公共返回類的實現(xiàn)

    本文主要介紹了SpringBoot 統(tǒng)一公共返回類的實現(xiàn),配置后臺的統(tǒng)一公共返回類,這樣做目的是為了統(tǒng)一返回信息,文中示例代碼介紹的很詳細,感興趣的可以了解一下
    2022-01-01

最新評論

上虞市| 会泽县| 曲靖市| 溧水县| 永嘉县| 奇台县| 光泽县| 孟连| 定陶县| 漠河县| 招远市| 台东市| 永济市| 梅州市| 德钦县| 调兵山市| 巴南区| 宁河县| 牟定县| 资阳市| 中卫市| 蒲城县| 佛学| 正蓝旗| 黑河市| 邢台市| 信丰县| 南充市| 长寿区| 龙岩市| 迁西县| 富顺县| 林州市| 津南区| 禹州市| 南宫市| 旺苍县| 惠安县| 博客| 江北区| 荃湾区|