本文目錄一覽:
如何理解JAVA堆棧
Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過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, 它是由編譯器完成的,它有利於節省空間。而一個對象引用變量修改了這個對象的內部狀態,會影響到另一個對象引用變量。
String是一個特殊的包裝類數據。可以用:
String str = new String(“abc”);
String str = “abc”;
兩種的形式來創建,第一種是用new()來新建對象的,它會在存放於堆中。每調用一次就會創建一個新的對象。
而第二種是先在棧中創建一個對String類的對象引用變量str,然後查找棧中有沒有存放”abc”,如果沒有,則將”abc”存放進棧,並令str指向”abc”,如果已經有”abc” 則直接令str指向“abc”。
比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==,下面用例子說明上面的理論。
String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一個對象的。
String str1 =new String (“abc”);
String str2 =new String (“abc”);
System.out.println(str1==str2); // false
用new的方式是生成不同的對象。每一次生成一個。
因此用第一種方式創建多個”abc”字符串,在內存中其實只存在一個對象而已. 這種寫法有利與節省內存空間. 同時它可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對於String str = new String(“abc”);的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。
另一方面, 要注意: 我們在使用諸如String str = “abc”;的格式定義類時,總是想當然地認為,創建了String類的對象str。擔心陷阱!對象可能並沒有被創建!而可能只是指向一個先前已經創建的 對象。只有通過new()方法才能保證每次都創建一個新的對象。
由於String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。
java中的“堆棧”是什麼意思?
堆棧是計算機為程序分配的內存空間,用來存儲數據的。
內存是計算機系統中一個主要部件, 用於保存進程運行時的程序和數據,也稱可執行存儲器。在計算機中,內存空間一般是指主存儲器空間(物理地址空間)或系統為一個用戶程序分配內存空間。擴展內存空間的方法一般有增加內存大小和虛擬內存。
源程序經過彙編或編譯後再經過鏈接編輯程序加工形成的程序的裝配模塊,及轉換為相對地址編址的模塊,它是以0為基址順序進行編址的。
相對地址也稱為邏輯地址或虛擬地址,把程序中由相對地址組成的空間叫做邏輯地址空間。相對地址空間通過地址再定位機構轉換到絕對地址空間,絕對地址空間也叫物理地址空間。
內存空間一般是指主存儲器空間(物理地址空間)或系統為一個用戶程序分配內存空間。系統為一個用戶程序分配內存空間方法有單一連續分配、固定分區分配、動態分區分配以及動態重定位分區分配四種方式。
為了便於內存分配,通常將分區按大小進行排隊,並為之建立一張分區使用表,其中各表項包括每個分區的起始地址、大小及狀態(是否已分配)。
當有一用戶程序要裝入時,由內存分配程序檢索該表,從中找出一個能滿足要求的、尚未分配的分區,將之分配給該程序,然後將該表項中的狀態置為“已分配” ;若未找到大小足夠的分區,則拒絕為該用戶程序分配內存。
java中的堆棧詳解
簡單的說 其實 棧 就是存放變量引用的一個地方, 堆 就是存放實際對象的地方 也就是.
比如: int i = 7; 這個 其實是存在棧裡邊的。內容為 i = 7。
Apple app = new Apple(); 這個 app 是在棧裡邊的 他對應的是一個內存地址也在堆裡邊, 而這個內存地址對應的是堆裡邊存放 Apple 實例的地址。
String s = “Hello World!”; 這個其實是存在另外一塊靜態代碼區。
總體來說: 棧–主要存放引用 和基本數據類型。
堆–用來存放 new 出來的對象實例。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/194072.html