java堆棧淺談,java堆棧詳解

本文目錄一覽:

如何理解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-tw/n/194072.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 09:42
下一篇 2024-12-02 09:42

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論