【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 存放
【python】python將資料儲存為文字檔案的兩種語法
file = open('filename','a',encoding='utf-8') file.write('......') file.close 上面這種標準的檔案儲存方式,開啟檔案、寫入資料、關閉檔案。 下面這種寫法,會隨著with語句的結束,自動關閉。 wi
【Java】Java中的資料儲存
堆,棧,靜態程式碼區(常量區) 在Java中,六個地方儲存資料: 1. 暫存器register: 最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制 最快的儲存區(由編譯
【JAVA】java中實現map集合的資料存取詳解三種方法。Android程式設計師也是要會寫的
長期維護的Android專案,裡面包括常用功能實現,以及知識點詳解, 當然還有java中的知識點。具體請看github: https://github.com/QQ986945193/DavidAndroidProjectTools 好了,說正題
【Java】——list中快速進行資料篩選
小編最近的專案中經常需要多個list拼接成一個,才能進行之後的操作,如何保證多個list拼接是一條資料呢?大家都知道list不能根據唯一標識進行篩選,那豈不成需要迴圈依次遍歷,考慮系統處理的資料量,這個執行起來那是相當影響程式的執行效率了,不能這樣將就啊,所以肯定能
【JAVA】java資料儲存-基礎型別,物件和字串
總所周知,java是一種面向物件的程式設計語言。在java裡,一切都被視為物件,因此可以採用單一固定的語法。儘管一切都看作物件,但是操縱的識別符號實際上是物件的一個“引用”,這個引用指向資料實際存放的地址。 而我們的資料被儲存到什麼地方呢?特別是記憶體是怎麼分配的呢?我們有
1000行代碼徒手寫正則表達式引擎【1】--JAVA中正則表達式的使用
基礎上 unicode 要求 [1] 分配 find 通過 images char 簡介: 本文是系列博客的第一篇,主要講解和分析正則表達式規則以及JAVA中原生正則表達式引擎的使用。在後續的文章中會涉及基於NFA的正則表達式引擎內部的工作原理,並在此基礎上用1000行左右
【轉載】Java中Comparable和Comparator比較
import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一
【Java】Java中的數據類型
target java 基本數據類型 item ref cnblogs com 技術分享 aik Java 語言是一種強類型語言。通俗點說就是,在 Java 中存儲的數據都是有類型的,而且必須在編譯時就確定其類型。Java 數據類型分為兩類,如圖: 在 Jav
【轉載】JAVA中IO流操作的基本規律總結
reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是
【java】java 中 byte[]、File、InputStream 互相轉換
new 文件名 讀寫 文件 tps byte數組 lan http 過程 ========================================================================= 使用過程中,一定要註意close()掉各個讀寫流!!
【Java】Swing中JTextPane中如何繪制行號
代碼 name panel 9.png 自己 顯示行號 led att gin Oracle在JTextPane類中並沒有直接提供顯示行號的方法,所以這個功能應該由程序員自己來完成,筆者發現網上很多的顯示行號的代碼都存在一個問題,就是不準確,特別是在行數變多了以後。 筆者
【小家java】Java中對時間戳相加減的問題(向前推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
【小家java】Java中主執行緒(父執行緒)與子執行緒的通訊和聯絡
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
【小家java】Java中的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9