1. 程式人生 > >Java中資料資料儲存

Java中資料資料儲存

注:僅是整理總結,發現錯誤之處望及時告知,感激不盡。今日看到關於常量池、堆的東西,發現心裡一點概念也不記得了,故做次筆記加深印象。

一、Java中資料存放的位置

(缺少硬體部分的關聯) 1、暫存器 ——最快的儲存區,處理器內部,由編譯器分配 2、棧 ——僅次於暫存器的儲存方法,位於通用RAM中,由堆疊指標的移動決定新增或釋放記憶體。存放基本型別的變數資料和物件,陣列的引用,但物件本身不存放在棧中,而是在堆或常量池中 3、堆 ——一種通用性的記憶體池(RAM中),存放所有Java物件(new出來的),動態分配(即執行時) 4、靜態儲存(static storage) ——存放程式執行時一直存在的資料,static標識的元素 5、常量池 ——常量通常直接存放在程式程式碼內部,字串常量和基本型別常量(public static final) 6、非RAM儲存:硬碟等永久儲存空間

二、棧、堆、常量池的區別

速度:暫存器>棧>堆>其他

對於棧和常量池中的物件可以共享,堆中的物件不可共享(共享是什麼層面上的意思??)
棧中的資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會消失;堆中的物件由垃圾回收器扶著回收
對於字串:其物件的引用都是儲存在棧中的,如果是編譯器已經建立好(直接用雙引號定義的)的就儲存在常量池中,如果是執行期(new出來的)才能確定的近儲存在堆中。對於通過 new 產生一個字串(假設為 ”china” )時,會先去常量池中查詢是否已經有了 ”china” 物件,如果沒有則在常量池中建立一個此字串物件,然後堆中再建立一個常量池中此 ”china” 物件的拷貝物件。這也就是有道面試題: String s = new String(“xyz”); 產生幾個物件?一個或兩個,如果常量池中原來沒有 ”xyz”, 就是兩個。

 對於基礎型別的變數和常量:變數和引用儲存在棧中,常量儲存在常量池中。  對於成員變數和區域性變數:成員變數就是方法外部,類的內部定義的變數;區域性變數就是方法或語句塊內部定義的變數。區域性變數必須初始化。形式引數是區域性變數,區域性變數的資料存在於棧記憶體中。棧記憶體中的區域性變數隨著方法的消失而消失。成員變數儲存在堆中的物件裡面,由垃圾回收器負責回收。 如以下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()將等待垃圾回收。

三、具體使用

1、對於基本型別,定義方式諸如int a = 3;char b = 'a';的形式來定義的稱為自動變數,自動變來個存的是字面值,不是類的例項(即不是類的引用),a是指向int型別的引用,指向3這個字面值。而3這個字面值就存在於棧中。 關於棧中資料共享的解釋:相等的字面值的引用指向棧內同一個字面值。例int x=1;int y=1;首先建立變數x的引用並開闢一個存放字面值1的地址,x指向這塊地址;處理int y=1時,先建立y的引用變數後,發現棧中已有字面值1,直接將y指向1的地址即可。 2、對於包裝類資料,如Integer,String,Double等,這些類資料全部存於堆中,Java用new語句來顯示地告訴編譯器,在執行時才會跟局需要動態建立。 對於自動拆箱、裝箱需要注意:把int變成Integer的時候,如果int那隻在-128~127之間,返回的並不是新new出來的Integer物件,而是一個已快取在堆中的Integer物件; Integer c = 127;   
        Integer d = 127;   
        Integer e = 128;   
        Integer f = 128;  
//編譯器後臺進行Integer f = new Integer(128)的轉換 System.out.println(c==d);   //true  
        System.out.println(e==f);   //false  
3、字串包裝類資料(String): 3.1 String str = "asd"建立過程: a.首先在常量池中查詢是否有“asd”字串物件 b1.若有直接讓str引用該物件 b2.若無則在常量池中建立“asd”,並讓str引用該物件 常量池屬於類資訊的一部分,而類資訊對應存在於JVM記憶體模型的方法區,而方法區是在JVM記憶體模型中的堆中有JVM來分配。所以“asd”可以說存在於堆中(不過,為了把方法區的堆區別於JVM的堆,有些資料會把方法區稱為棧)。“asd”在編譯時會被寫入位元組碼中,當class檔案被載入時,JVM就為“asd”在常量池中分配記憶體,所以和靜態區差不多(靜態區是什麼) 3.2 String str = new String ("asd")的建立過程 a.首先在堆中(不是常量池)建立物件“asd”,並讓str引用指向該物件 b.在字串常量池中檢視是否存在內容為“asd”的字串物件 c1.若存在,則將new出來的字串物件與字串常量池中的物件聯絡起來(什麼叫聯絡起來) c2.若不存在,則在字串常量池中建立內容為“asd”的字串物件,並將堆中的物件與之聯絡起來 關注intern()方法,返回該字串在常量池中的物件的引用。

相關推薦

javahashtable怎樣儲存資料和讀取資料

Hashtable-雜湊表類 以雜湊表的形式儲存資料,資料的形式是鍵值對. 特點: 查詢速度快,遍歷相對慢 鍵值不能有空指標和重複資料 建立Hashtable<Integer,String> ht=new Hashtable<Integer,String>(); 添值 ht.put(

Java各種資料型別的儲存-堆/棧

Java的記憶體分兩種:棧記憶體和堆記憶體 棧記憶體:在函式中定義的基本型別變數和引用變數都在棧記憶體中分配 例如: public void test(){ int a = 1; Person p = new Person();

JavaJava資料儲存

堆,棧,靜態程式碼區(常量區) 在Java中,六個地方儲存資料: 1. 暫存器register: 最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制 最快的儲存區(由編譯

Java資料儲存(堆及堆疊)

轉自:http://www.iteye.com/topic/634530 1.暫存器:最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制. 2. 棧:存放基本型別的變數資料和物件的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)或者常量池中(物

Java資料儲存(堆、棧、常量池)

原文轉自http://bbs.itheima.com/thread-9597-1-1.html 1.暫存器:最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制。 2.棧:存放基本型別的變數資料和物件的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)

java資料儲存,位元組轉換,位操作

1. java中資料儲存是按照位元組儲存的,一個位元組是8位,也就是java中的byte資料型別,java中byte表示的是有符號數,第八位(從右至左)表示的是符號位,一個位元組表示的範圍是2^8,也就是256個數,表示的範圍是:-128到127,因為第八位始終是符號位,所

java資料型別及轉換形式

   java中的資料型別分為兩種:基本資料型別和引用資料型別;    基本資料型別中包含的就是我們常說的“四類八種”,即 整數型:byte、short、int、long,浮點型:float、double,布林型:boolean,字元型:char 4類8種

java資料結構——圖

圖是一種以網路形式相互連線的節點,圖是一種與樹有些相似的資料結構,圖通常有一個固定的形狀, 這是由物理或抽象的問題所決定的。圖包含由邊連線的頂點。 型別,無向圖,有向圖(邊有方向,通常用箭頭表示) 圖可以用兩種形式表示,鄰接矩陣,鄰接表,鄰接矩陣或鄰接表提供了關於當前頂點的位置資訊,當前 頂

java資料結構——棧

棧的工作原理,後進先出。 棧,佇列是比陣列和其他資料結構更抽象的結構,主要通過介面對棧,佇列進行定義,而他們的主要實 現機制對使用者是不可見的。 棧的主要機制可以用陣列來實現,也可以用連結串列來實現。優先順序佇列的內部 實現可以用陣列或一種特殊的樹(堆)來實現。 棧只允許訪問一個數據項,即最

java資料結構——陣列

在Java中,陣列非常常用,大部分的資料結構也是基於陣列來實現的。 與陣列有關的話題: 1.在java中,宣告一個數組過程中,是如何分配記憶體的? A. 當宣告陣列型別變數時,為其分配了(32位)引用空間,由於未賦值,因此並不指向任何物件; B.當建立了一個數組物件(也就是new出來的)並將

java資料結構——樹

樹 樹形結構是一種層級式的資料結構,由節點和連線它們的邊組成, java語言編寫的程式中常常用引用來表示邊。根是樹中頂端的節 點:它沒有父節點。節點表示儲存在樹中的資料物件。非平衡樹是 指根左邊的後代比右邊多,或者相反。 區分樹和圖的主要特徵是樹中不存在環路。 樹的節點 Root,par

java資料結構——連結串列

連結串列 連結串列也是線性資料結構,與陣列相比,在記憶體分配、內部結構及資料插入和刪除的操作上均有不同。 連結串列用途廣泛,適用於許多通用的資料庫,也可以取代陣列,作為其他儲存結構的基礎。 在連結串列中,每個資料項都被包含在鏈節點中,一個鏈節點是某個類的物件,這個類叫做Link。因為一個

java資料結構——雜湊表

雜湊表 雜湊法是一個用於唯一標識物件並將每個物件儲存在一些預先計算的唯一索引(鍵)中的過程,因此, 物件以鍵值對的形式儲存,鍵值對的集合稱為字典,可以使用鍵搜尋每個物件。雜湊法有很多不同的數 據結構,但最常用的是雜湊表。 雜湊表通常使用陣列實現,它可以提供快速的查詢和插入操作,雜湊表不僅

Java由於資料太大自動轉換成科學計數法解決方式

1.java後臺 (1)使用BigDecimal類 方式一:String str=new BigDecimal(num+”“).toString(); 方式二:String str=new BigDecimal(num.toString()).toString(); (2)使用De

Java基本資料型別與包裝類,字串轉換

儲存範圍大小: byte-short-char-int-long-float-double 低階到高階自動型別轉換: int i = 5; float f = i; double d = i; 高階到低階強制型別轉換: int a = 20; byte b = (byte) a;

圖解 Java 資料結構及原理,傻瓜也能看懂!

最近在整理資料結構方面的知識, 系統化看了下Java中常用資料結構, 突發奇想用動畫來繪製資料流轉過程。 主要基於jdk8, 可能會有些特性與jdk7之前不相同, 例如LinkedList LinkedHashMap中的雙向列表不再是迴環的。 HashMap中的單鏈表是尾插, 而不是頭插入等等, 後文

JAVA 資料結構

Java 資料結構 Java工具包提供了強大的資料結構。在Java中的資料結構主要包括以下幾種介面和類: 列舉(Enumeration) 位集合(BitSet) 向量(Vector) 棧(Stack) 字典(Dictionary) 雜湊表(Hashtable)

java資料型別轉換

一,強制型別轉換        1特點;不能自動完成,程式碼需要特殊格式處理         2格式:範圍小的型別 範圍小的變數名 =(範圍小的型別) 原本範圍大的型別;

java資料結構——佇列

佇列 與棧相似,佇列也是順序儲存元素的線性資料結構,但佇列是先進先出。 操作 插入:put,add,enque 刪除:delete,get,deque 插入資料項的隊尾:back,tail,end 移除資料項的隊頭:head 檢視:peek,返回隊頭資料項的值,

Java常見資料結構:list與map -底層如何實現

1:集合 2 Collection(單列集合) 3 List(有序,可重複) 4 ArrayList 5 底層資料結構是陣列,查詢快,增刪慢 6 執行緒不安全,效率高