亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中的數據存儲(堆及堆棧)

2019-11-06 06:55:26
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(對象可能在常量池里)(字符串常量對象存放在常量池中。)3. 堆:存放所有new出來的對象。4. 靜態域:存放靜態成員(static定義的)5. 常量池:存放字符串常量和基本類型常量(public static final)。有時,在嵌入式系統中,常量本身會和其他部分分割離開(由于版權等其他原因),所以在這種情況下,可以選擇將其放在ROM中 。6. 非RAM存儲:硬盤等永久存儲空間這里我們主要關心棧,堆和常量池,對于棧和常量池中的對象可以共享,對于堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定,具有很大的靈活性。對于字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對于equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。如以下代碼:

Java代碼  收藏代碼String s1 = "china";  String s2 = "china";  String s3 = "china";  String ss1 = new String("china");  String ss2 = new String("china");  String ss3 = new String("china");  

 

這里解釋一下黃色這3個箭頭,對于通過new產生一個字符串(假設為”china”)時,會先去常量池中查找是否已經有了”china”對象,如果沒有則在常量池中創建一個此字符串對象,然后堆中再創建一個常量池中此”china”對象的拷貝對象。這也就是有道面試題:String s = new String(“xyz”);產生幾個對象?一個或兩個,如果常量池中原來沒有”xyz”,就是兩個。

對于基礎類型的變量和常量:變量和引用存儲在棧中,常量存儲在常量池中。如以下代碼:

Java代碼  收藏代碼int i1 = 9;  int i2 = 9;  int i3 = 9;   public static final int INT1 = 9;  public static final int INT2 = 9;  public static final int INT3 = 9;  

對于成員變量和局部變量:成員變量就是方法外部,類的內部定義的變量;局部變量就是方法或語句塊內部定義的變量。局部變量必須初始化。形式參數是局部變量,局部變量的數據存在于棧內存中。棧內存中的局部變量隨著方法的消失而消失。成員變量存儲在堆中的對象里面,由垃圾回收器負責回收。注意:棧里只有一個9 ,i1,i2,i3 都指向9 。如果 令 i2=7;會在棧里生成7 再令i2 指向7。如以下代碼:

Java代碼  收藏代碼class BirthDate {      PRivate int day;      private int month;      private int year;          public BirthDate(int d, int m, int y) {          day = d;           month = m;           year = y;      }      省略get,set方法………  }    public class Test{      public static void main(String args[]){  int date = 9;          Test test = new Test();                   test.change(date);           BirthDate d1= new BirthDate(7,7,1970);             }          public void change1(int i){          i = 1234;      }  

}對于以上這段代碼,date為局部變量,i,d,m,y都是形參為局部變量,day,month,year為成員變量。下面分析一下代碼執行時候的變化:1. main方法開始執行:int date = 9;date局部變量,基礎類型,引用和值都存在棧中。2. Test test = new Test();test為對象引用,存在棧中,對象(new Test())存在堆中。3. test.change(date);i為局部變量,引用和值存在棧中。當方法change執行完成后,i就會從棧中消失。4. BirthDate d1= new BirthDate(7,7,1970);  d1為對象引用,存在棧中,對象(new BirthDate())存在堆中,其中d,m,y為局部變量存儲在棧中,且它們的類型為基礎類型,因此它們的數據也存儲在棧中。day,month,year為成員變量,它們存儲在堆中(new BirthDate()里面)。當BirthDate構造方法執行完之后,d,m,y將從棧中消失。5.main方法執行完之后,date變量,test,d1引用將從棧中消失,new Test(),new BirthDate()將等待垃圾回收------------------------------------------------------------------------------------------------------------------------------JVM 中的堆棧JVM是基于堆棧的虛擬機.JVM為每個新創建的線程都分配一個堆棧.也就是說,對于一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作。   我們知道,某個線程正在執行的方法稱為此線程的當前方法.我們可能不知道,當前方法使用的幀稱為當前幀。當線程激活一個Java方法,JVM就會在線程的 Java堆棧里新壓入一個幀。這個幀自然成為了當前幀.在此方法執行期間,這個幀將用來保存參數,局部變量,中間計算過程和其他數據.這個幀在這里和編譯原理中的活動紀錄的概念是差不多的.   從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有先進后出的特性。   每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創建的所有類實例或數組都放在這個堆中,并由應用所有的線程共享.跟C/C++不同,Java中分配堆內存是自動初始化的。Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。JAVA 堆棧棧與堆都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置?;蚨??! ava的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。   棧的優勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。   棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:   int a = 3;   int b = 3;   編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。這時,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改并不會影響到b, 它是由編譯器完成的,它有利于節省空間。而一個對象引用變量修改了這個對象的內部狀態,會影響到另一個對象引用變量 ----------------------------------------------------------------------------------------------另外還有一個疑問:int [] arr={1,2,3,4}即沒有用new 顯示生成的原始類型數組是存放在哪的。是存放在堆還是棧里。在c++ 里肯定是在棧里(C++ 在堆里生成的一定要手動delete 掉自己回收的,而int a[]={1,3}我們不需手動回收)

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人激情视频免费观看| 97欧美精品一区二区三区| 欧美成人合集magnet| 久久精品国产v日韩v亚洲| 伊人青青综合网站| 国产成人av网| 狠狠色香婷婷久久亚洲精品| 国产欧美日韩精品丝袜高跟鞋| 亚洲视频第一页| 亚洲精品自在久久| 成人激情视频免费在线| 久久久精品免费| 亚洲精品av在线播放| 亚洲免费伊人电影在线观看av| 亚洲91精品在线| 欧美伦理91i| 欧美电影第一页| 亚洲综合精品一区二区| 日韩动漫免费观看电视剧高清| 亚洲第一中文字幕在线观看| 国产一区二区日韩精品欧美精品| 最新中文字幕亚洲| 91免费看片网站| 日本精品一区二区三区在线播放视频| 精品视频www| 久久免费在线观看| 欧美在线视频网| 国产欧美日韩专区发布| 久久久久久中文字幕| 亚洲人成欧美中文字幕| 国产视频欧美视频| 欧美一级片久久久久久久| 精品动漫一区二区| 久久成年人免费电影| 亚洲一级黄色片| 国产精品视频一区国模私拍| 国产精品久久久久高潮| 日韩欧美有码在线| 91人成网站www| 夜夜狂射影院欧美极品| 国产www精品| 久久这里有精品视频| 亚洲午夜av久久乱码| 日韩精品视频在线| 亚洲色图在线观看| 日韩成人激情视频| 日韩视频在线一区| 国产视频观看一区| 亚洲人精品午夜在线观看| 91精品国产网站| 国产精品美女无圣光视频| 亚洲欧洲中文天堂| 欧美成人黄色小视频| 91亚洲精华国产精华| 亚洲精品久久在线| 亚洲欧美中文日韩v在线观看| 91午夜在线播放| 国产成人在线亚洲欧美| 国产精品免费网站| 久久精品影视伊人网| 国产精品欧美风情| 日韩在线观看免费| 国产精品亚洲欧美导航| 久久久这里只有精品视频| 欧美专区福利在线| 久久电影一区二区| 亚洲片国产一区一级在线观看| 91精品视频一区| 中文日韩在线观看| 高清日韩电视剧大全免费播放在线观看| 久久久久国色av免费观看性色| 亚洲成人亚洲激情| 亚洲视频欧美视频| 欧美裸体视频网站| 在线视频日本亚洲性| 成人av色在线观看| 精品中文字幕久久久久久| 成人av在线亚洲| 亚洲精品日韩丝袜精品| 中文精品99久久国产香蕉| 国产精品一区二区三区在线播放| 成人性教育视频在线观看| 国产精品精品久久久久久| 国产一区二区三区在线| 久久精品国亚洲| 精品国产精品三级精品av网址| 日韩欧美亚洲成人| 国产精品久久久久久av下载红粉| 一区二区三欧美| 亚洲激情视频在线| 国产精品一区二区久久久| 在线电影欧美日韩一区二区私密| 久国内精品在线| 亚洲国产精品成人va在线观看| 国产精品黄视频| 国产精品国产三级国产aⅴ浪潮| 亚洲新声在线观看| 久久久久久69| 亚洲欧美成人在线| 上原亚衣av一区二区三区| 国产精品亚洲美女av网站| 欧美激情在线一区| 国产欧美婷婷中文| 日韩精品极品毛片系列视频| 久久久久久久久久久成人| 国产精品福利在线观看网址| 国产一区视频在线播放| 精品亚洲一区二区| 91中文字幕一区| 欧美成人全部免费| 成人h视频在线| 国产精品久久久999| 久久久99免费视频| 91社区国产高清| 91亚洲国产成人久久精品网站| 久久国产精品久久久久| 国产精品入口免费视频一| 欧美性极品xxxx娇小| 欧美色视频日本高清在线观看| 久久久久久国产精品| 亚洲欧美国产精品久久久久久久| 国产精品丝袜高跟| 高清欧美一区二区三区| 韩剧1988免费观看全集| 亚洲午夜未删减在线观看| 国产成人中文字幕| 欧美一级高清免费播放| 91美女片黄在线观| www.亚洲一区| 尤物tv国产一区| 亚洲伦理中文字幕| 国内精品400部情侣激情| 国产欧美日韩免费看aⅴ视频| 日韩av中文在线| 青草青草久热精品视频在线网站| 色综合导航网站| 日韩中文字幕亚洲| 国产午夜精品一区理论片飘花| 精品久久久久人成| 欧美中文字幕视频| 欧美性生活大片免费观看网址| 久久人人爽人人爽人人片av高请| 日韩欧美中文字幕在线播放| 97精品伊人久久久大香线蕉| 91久久久在线| 亚洲日本中文字幕| 欧美人成在线视频| 日本精品久久久久久久| 亚洲精品日韩久久久| 久久久久国产精品www| 色一情一乱一区二区| 久久影视三级福利片| 国产欧美va欧美va香蕉在线| 国产精品久久综合av爱欲tv| 亚洲国产古装精品网站| 久久免费视频观看| 亚洲福利视频二区| 亚洲无线码在线一区观看| 日韩在线视频观看正片免费网站| 久久久亚洲国产天美传媒修理工| 亚洲精品日韩激情在线电影| 精品少妇v888av| 国产一区二区三区在线| 波霸ol色综合久久|