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

【Java】Java中的資料儲存

堆,棧,靜態程式碼區(常量區)

在Java中,六個地方儲存資料:

1. 暫存器register:

最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制
  • 最快的儲存區(由編譯器根據需求分配,無法從程式中控制)
  • 位於處理器內部
  • 數量有限

2. 棧sack:

存放基本型別的變數資料和物件,陣列的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)或者常量池中(字串常量物件存放在常量池中)
  • 速度僅次於暫存器 
    通過它的“棧指標”從處理器獲得支援; 
    棧指標向下移動,分配新記憶體;向上,釋放記憶體; 
    這一約束限制了程式的靈活性:建立程式時,JAVA編譯器必須知道儲存在棧內所有資料的確切大小和生命週期,生成相應程式碼,以便上下移動棧指標;因此某些JAVA資料儲存在棧中,而JAVA物件不儲存在其中
  • 位於通用RAM中 
    (RAM,random access memory隨機存取儲存器),與CPU直接交換資料的內部儲存器,也叫主存(記憶體)。隨時讀寫,速度很快,通常作為臨時資料儲存媒介)

3. 堆heap

存放所有new出來的物件
  • 位於通用RAM中,用來存放所有的JAVA物件
  • 不同於棧的好處:不需要知道儲存資料分配多少區域以及生命週期,有很大的靈活性
  • 需要建立一個物件時,只需new一行程式碼,執行這行程式碼,會自動在堆裡進行儲存分配
  • 為這種靈活性付出相應程式碼,用堆進行儲存分配比用棧進行儲存需要更多的時間

4. 靜態儲存static storage

存放靜態成員(static定義的)
  • 靜態是指“在固定的位置”
  • 靜態儲存裡存放程式執行時一直存在的資料
  • 可用關鍵字static來標識一個物件的特定元素是靜態的
  • 但JAVA物件本身從來不會存放在靜態儲存空間裡

5. 常量儲存constant storage

存放字串常量和基本型別常量(public static final)
  • 常量值通常直接存放在程式程式碼內部
  • 有時在嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中 
    (ROM,Read Only Memory,只讀記憶體。一種只能讀出事先所存資料的固態半導體儲存器,它相當於PC機上的硬碟,用來儲存和儲存資料。RAM和ROM相比,兩者的最大區別是RAM在斷電以後儲存在上面的資料會自動消失,而ROM就不會。)

6. 非RAM儲存

硬碟等永久儲存空間
  • 如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有執行時也可以存在。

整體速度比較:

暫存器 < 棧 < 堆 < 其他
棧和常量池中的物件可以共享,對於堆中的物件不可以共享
棧中的資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會消失。堆中的物件的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。
對於字串:其物件的引用都是儲存在棧中的,如果是編譯期已經建立好(直接用雙引號定義的)的就儲存在常量池中,如果是執行期(new出來的)才能確定的就儲存在堆中。對於equals相等的字串,在常量池中永遠只有一份,在堆中有多份。

相關推薦

Android專案資料夾和檔案的作用

Table of Contents 資料夾的作用  檔案的作用    資料夾的作用  No. 資料夾 描述 1 src 存放

pythonpython將資料儲存為文字檔案的兩種語法

file = open('filename','a',encoding='utf-8') file.write('......') file.close 上面這種標準的檔案儲存方式,開啟檔案、寫入資料、關閉檔案。 下面這種寫法,會隨著with語句的結束,自動關閉。 wi

JavaJava資料儲存

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

JAVAjava實現map集合的資料存取詳解三種方法。Android程式設計師也是要會寫的

長期維護的Android專案,裡面包括常用功能實現,以及知識點詳解, 當然還有java中的知識點。具體請看github: https://github.com/QQ986945193/DavidAndroidProjectTools 好了,說正題

Java——list快速進行資料篩選

    小編最近的專案中經常需要多個list拼接成一個,才能進行之後的操作,如何保證多個list拼接是一條資料呢?大家都知道list不能根據唯一標識進行篩選,那豈不成需要迴圈依次遍歷,考慮系統處理的資料量,這個執行起來那是相當影響程式的執行效率了,不能這樣將就啊,所以肯定能

JAVAjava資料儲存-基礎型別,物件和字串

總所周知,java是一種面向物件的程式設計語言。在java裡,一切都被視為物件,因此可以採用單一固定的語法。儘管一切都看作物件,但是操縱的識別符號實際上是物件的一個“引用”,這個引用指向資料實際存放的地址。 而我們的資料被儲存到什麼地方呢?特別是記憶體是怎麼分配的呢?我們有

1000行代碼徒手寫正則表達式引擎1--JAVA正則表達式的使用

基礎上 unicode 要求 [1] 分配 find 通過 images char 簡介: 本文是系列博客的第一篇,主要講解和分析正則表達式規則以及JAVA中原生正則表達式引擎的使用。在後續的文章中會涉及基於NFA的正則表達式引擎內部的工作原理,並在此基礎上用1000行左右

轉載JavaComparable和Comparator比較

import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一

JavaJava的數據類型

target java 基本數據類型 item ref cnblogs com 技術分享 aik Java 語言是一種強類型語言。通俗點說就是,在 Java 中存儲的數據都是有類型的,而且必須在編譯時就確定其類型。Java 數據類型分為兩類,如圖: 在 Jav

轉載JAVAIO流操作的基本規律總結

reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是

javajava byte[]、File、InputStream 互相轉換

new 文件名 讀寫 文件 tps byte數組 lan http 過程 ========================================================================= 使用過程中,一定要註意close()掉各個讀寫流!!

JavaSwingJTextPane如何繪制行號

代碼 name panel 9.png 自己 顯示行號 led att gin Oracle在JTextPane類中並沒有直接提供顯示行號的方法,所以這個功能應該由程序員自己來完成,筆者發現網上很多的顯示行號的代碼都存在一個問題,就是不準確,特別是在行數變多了以後。 筆者

小家javaJava對時間戳相加減的問題(向前推100天,答案卻讓我匪夷所思)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

java堆的排序

Java實現堆排序(大根堆)   堆排序是一種樹形選擇排序方法,它的特點是:在排序的過程中,將array[0,...,n-1]看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(最小)的元素。 1. 若array[0,...,n

轉載Java 帶參無返回、帶參帶返回值、方法的重載

語法 ble 數組 實現 執行 愛慕 包含 參數 com 一、 有時方法的執行需要依賴於某些條件,換句話說,要想通過方法完成特定的功能,需要為其提供額外的信息才行。例如,現實生活中電飯鍋可以實現“煮飯”的功能,但前提是我們必須提供食材,如果我們什麽都不提供,那就真是的“巧婦

轉載Java 帶參無返回、帶參帶返回值、方法的過載

一、 有時方法的執行需要依賴於某些條件,換句話說,要想通過方法完成特定的功能,需要為其提供額外的資訊才行。例如,現實生活中電飯鍋可以實現“煮飯”的功能,但前提是我們必須提供食材,如果我們什麼都不提供,那就真是的“巧婦難為無米之炊”了。我們可以通過在方法中加入引數列表接收外部傳入的資料資訊,引數可以是任意的基

轉載Java 從原字符串截取一個新的字符串 subString()

處的 src fbo urg 字符 bsp .html return exceptio substring public String substring(int beginIndex) 返回一個新的字符串,它是此字符串的一個子字符串。該子字符串從指定索引處的字符開始,直到

轉載Java 從原字串擷取一個新的字串 subString()

substring public String substring(int beginIndex) 返回一個新的字串,它是此字串的一個子字串。該子字串從指定索引處的字元開始,直到此字串末尾。 示例: "unhappy".substring(2) returns

小家javaJava主執行緒(父執行緒)與子執行緒的通訊和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

小家javaJava的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9