国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java中的數據存儲結構

2019-11-06 06:02:01
字體:
來源:轉載
供稿:網友

java中的數據存儲結構

在java中數據的存儲結構可以分為六種:

寄存器存儲區堆棧區堆區靜態存儲區常量存儲區非RAM數據存儲區

寄存器存儲區

由于位于處理器cpu的內部,所以其是最快的存儲區,然而寄存器的空間極其珍貴有限,所以程序開發者無法直接控制寄存器空間的分配,它的分配工作是由編譯器自行分配的.

特點:最快的存儲區, 由編譯器根據需求進行分配,開發者在程序中無法進行控制.

堆棧存儲區

位于通用RAM中,即內存中。它可以通過”堆棧指針”從cpu那里獲取支持,通過操作”堆棧指針”的上下移動來實現堆棧區中對內存的申請和釋放.堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,速度僅次于寄存器.

創建程序時候,JAVA編譯器必須知道存儲在堆棧內所有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中.

特點:存放基本類型的變量數據和對象,數組的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中).
@Test public void stack(String msg){ //調用方法是在棧內存中為參數msg分配存儲空間,方法結束自動釋放。 int count=0; //count是方法中的局部變量,存儲在棧內存中(基于效率的考慮, 基本類型數據的引用和值都存放在棧內存中),方法結束時候,釋放內存 LoginPResenterTest presenterTest=new LoginPresenterTest();//局部變量是復雜數據類型LoginPresenterTest,對象的引用presenterTest存放在棧內存中,而對象的創建發生在堆內存中. }

堆區

跟堆棧區一樣也存在于RAM中,用于存放所有的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲區域,也不必知道存儲的數據在堆里存活多長時間。因此,在堆里分配存儲有很大的靈活性。當你需要創建一個對象的時候,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆里進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用堆棧進行存儲存儲需要更多的時間.

特點:存放所有new出來的對象,而針對堆中對象內存的回收依賴于GC.

靜態存儲區

存儲用static修飾的成員變量或方法.雖然static關鍵字可以用來標識一個對象是靜態的,但JAVA對象本身不會被存放在靜態存儲空間里,而是存儲在堆內存區.

特點:存放static修飾的靜態成員(方法或變量)

常量存儲區

常量(字符串常量和基本類型常量)通常直接存儲在程序代碼內部(常量池)。這樣做是安全的,因為它們的值在初始化時就已經被確定,并不會被改變。常量池在java用于保存在編譯期已確定的,已編譯的class文件中的一份數據。它包括了關于類,方法,接口等中的常量,也包括字符串常量,如String s = “abc”這種字面量方式.

特點:存放字符串常量和基本類型常量(public static final).

非RAM數據存儲區

如果數據完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運行時也可以存在.

特點:硬盤等永久存儲空間.

堆與堆棧的關系:

這是一個關于堆與棧關系的引用說明

堆:堆是heap,是所謂的動態內存,其中的內存在不需要時可以回收,以分配給新的內存請求,其內存中的數據是無序的,即先分配的和隨后分配的內存并沒有什么必然的位置關系,釋放時也可以沒有先后順序。一般由使用者自由分配,在C語言中malloc分配的就是堆,需要手動釋放。 堆棧:就是stack。實際上是只有一個出入口的隊列,即后進先出(frist in , last out),先分配的內存必定后釋放。一般由,由系統自動分配,存放函數的參數值,局部變量等,自動清除。 還有,堆是全局的,堆棧是每個函數進入的時候分一小塊,函數返回的時候就釋放了,靜態和全局變量,new得到的變量,都放在堆中,局部變量放在堆棧中,所以函數返回,局部變量就全沒了。 JAVA中的基本類型,其實需要特殊對待。因為,在JAVA中,通過new創建的對象存儲在“堆”中,所以用new 創建一個小的、簡單的變量,如基本類型等,往往不是很有效。因此,在JAVA中,對于這些類型,采用了與C、C++相同的方法。也就是說,不用new 來創建,而是創建一個并非是“引用”的“自動”變量。這個變量擁有它的“值”,并置于堆棧中,因此更高效。 實際上類的實例方法在內存中是只有一份,不過肯定不會是第一個對象中,如果是第一個對象的話,那么當第一個對象被銷毀的時候,那么后面的對象就永遠無法調用了。 類的實例方法存在一個專門的區叫方法區(method area),事實上類剛裝載的時候就被裝載好了,不過它們在”睡眠”,只是這些方法必須當有對象產生的時候才會”蘇醒”.(比如,一個輸出類的成員變量的方法,如果連對象都沒有,何來的輸出成員變量).所以,方法在裝載的時候就有了,但是不可用,因為它沒有指象任何一個對象. 而靜態的又不一樣了,靜態的東西存在靜態存儲(static storage)區,他們和類是一個等級的,就是說只要類被裝載,它們就可以直接用.(用類名來調用).他們不依賴與任何對象,所以也不能輸出任何對象的成員屬性.(除非成員屬性也是靜態的). 每個對象在new的時候都會在堆區中開辟內存,用來保存對象的屬性和方法.(實際上方法保存的只是方法區的引用,如果保存的是方法本身,那么試想一下,有多少個對象就得有多少個方法,那么又和第一點中”實例方法在內存中只有一份拷貝”相矛盾了)。


棧內存中存儲的數據可以實現數據共享

假設我們定義了兩個局部變量(注意局部變量和方法形參才保存在棧中,成員變量是保存在堆中,不要混淆了) int s1=20;int s2=20;編譯器工作流程如下:

在棧中申請一個名為”s1”的存儲空間,然后查看棧中是否存放著一個”20”的值;如果棧中不存在”20”的值,就向棧中添加一個”20”的值,然后讓s1等于這個值.如果棧中存在”20”的值,就讓s1等于這個值而不用在棧中重新加入一個”20”的值.完成了對s1的數據分配后,由于s2=20,所以就不用再為s2在棧中重新分配”20”這個值了,這樣就實現了數據共享,節省了內存空間.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杭州市| 黄平县| 大姚县| 洛隆县| 康定县| 柘荣县| 克山县| 利津县| 称多县| 大方县| 五家渠市| 泉州市| 松潘县| 喀什市| 天等县| 新田县| 炎陵县| 舞阳县| 苏尼特左旗| 宜州市| 阜宁县| 怀仁县| 太和县| 祁连县| 凤阳县| 夏津县| 教育| 敦化市| 黄骅市| 建昌县| 萍乡市| 永春县| 社会| 曲水县| 宜都市| 南平市| 咸丰县| 温宿县| 阿荣旗| 安义县| 南汇区|