」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Java中字串的記憶體分配

Java中字串的記憶體分配

發佈於2024-11-12
瀏覽:163

Memory Allocation of Strings in Java

在Java中,字串作為String類別的物件儲存在記憶體中。

當為任何Java程式分配記憶體時,JVM(Java虛擬機器)將分配的記憶體分為兩部分。一部分是棧,另一部分是堆。在堆內存中,java分配了一些內存,特別是對於字面量,這塊內存被稱為字串常數池(SCP)。 SCP 是堆內預先定義的區域。字串池有助於為 Java 運行時節省大量空間。 String 類別使用 SCP 來儲存唯一的字串文字。

在堆疊記憶體中,儲存變數或變數參考或物件的參考。

在堆記憶體中,儲存了所有動態分配的物件。為了給物件分配內存,我們使用 new 關鍵字。

建立字串物件有兩種方法。

  1. 字串文字

字串 str1 = “MyString”;

每當我們建立字串文字時,JVM首先檢查該字串文字是否已存在於字串常數池中。如果不可用,它將在 SCP 中建立一個新的字串文字。

上圖中,str1指向SCP中的「MyString」。以下是處理新建立的字串文字的方式。

  1. 透過使用新關鍵字

String str2 = new String(“MyString”); //使用新關鍵字實例化字串類別

當使用new關鍵字建立字串物件時,會建立兩個物件。一個在 SCP 中,另一個在堆中,引用變數儲存在堆疊中。

我們已經使用

創建了文字“MyString”

字串 str1 = “MyString”;

由於SCP中不能有重複項,因此JVM不會在SCP中再建立一個對象,而是傳回對堆疊中變數str3的現有引用,並在堆中建立一個物件。 Str3將指向堆中的物件“MyString”,但不指向SCP中的物件。

以下是字串物件記憶體分配的不同情況。

情況1:上面定義的字串物件在記憶體中是如何儲存的。

公共類別字串儲存概念

{

public static void main(String[] args)

{

字串 str1 = “MyString”;

String str2 = new String(“MyString”);

System.out.println(str1 == str2); //輸出:False

System.out.println(str1.equals(str2)); //輸出:True

}

}

當我們使用「==」運算子來比較 str1 和 str2 時,它會傳回 false。眾所周知,「==」運算子會比較它們的實體位址。在我們的範例中,str1 指向 SCP 中的對象,str2 指向堆中的對象。所以它回傳 false。
但在 str1.equals(str2) 的情況下,正如我們所知,「equals」函數檢查 str1 和 str3 的各個字元是否具有相同的儲存值,它會傳回 true。

情況2:另一個字串文字

字串 str3 = “MyString”;

str1和str3都將指向SCP中相同的字串文字。

公共類別字串儲存概念

{

public static void main(String[] args)

{

字串 str1 = “MyString”;

字串 str3 = “MyString”;

System.out.println(str1 == str2); //輸出:True

System.out.println(str1.equals(str2)); //輸出:True

}

}

s1 == s3 傳回 true,因為「==」運算子比較它們的實體位址,但不比較內容。
s1.equals(s3) 傳回 true,「equals」 函數檢查兩個引用變數中的單一字元。

情況3:使用新關鍵字建立另一個字串物件

String str4 = new String(“NewString”);

在這種情況下,JVM會在SCP中檢查字串,但找不到值為「NewString」的字串對象,因此會建立兩個對象,一個在SCP中,另一個在Heap中,引用變數str4將儲存在堆疊。 Str4 將擁有對堆中物件的引用。

情況 4:建立另一個字串文字。

字串 str5 = “NewString”;

在這種情況下,JVM會在SCP中檢查該文字是否已經可用,這裡「NewString」已經存在於SCP中,因此JVM不會在SCP中建立重複項,而是傳回變數str5的引用。

情況 5:將一個字串指派給另一個字串

String str4 = new String(“NewString”);

字串 str6 = str4; //賦值

這裡str6和str4會指向Heap中的同一個對象,不會擦除str4中的值。

公共類別字串儲存概念

{

public static void main(String[] args)

{

String str4 = new String(“NewString”);

字串 str6 = str4;

System.out.println(str4 == str6); //輸出:true

}

}

JVM會將堆中「NewString」的引用賦予變數str6。這就是 str4 == str6 傳回 true 的原因。

總之,使用字串文字和「new」運算子建立字串物件有其優點和缺點。

透過使用字串文字,我們可以透過不建立重複項來提高記憶體效率。 JVM 會建立一個唯一的對象,並且該字串永遠保留在 SCP 中。這樣做的缺點是字串池的大小是固定的,有時會變滿。
但透過使用 new 關鍵字,它創建了兩個對象,一個在 SCP 中,另一個在堆中。在堆中,如果我們不需要該對象,垃圾收集器將刪除該對像以騰出空間。但這樣做的缺點是,使用「new」運算符,JVM 總是必須建立一個新對象,這對 JVM 來說是一個重載。

版本聲明 本文轉載於:https://dev.to/soumya_deypersevere08_/memory-allocation-of-strings-in-java-1393?1如有侵犯,請聯繫[email protected]刪除
最新教學 更多>
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-05-12
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-05-12
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-05-12
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解決此問題,必須確保提供給HAAR CASCADE XML文件的路徑有效。在提供的代碼片段中,級聯分類器裝有硬編碼路徑,這可能對您的系統不准確。相反,OPENCV提...
    程式設計 發佈於2025-05-12
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-05-12
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-05-12
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-05-12
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-05-12
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-05-12
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-05-12
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-05-12
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-12
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-05-12
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-05-12
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-05-12

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3