搜尋
首頁Javajava教程Java中字串常數池的詳解

Java中字串常數池的詳解

Oct 16, 2018 pm 05:01 PM
java字串

這篇文章帶給大家的內容是關於Java中字串常數池的詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

作為最基礎的引用資料類型,Java 設計者為String 提供了字串常數池以提高其效能,那麼字串常數池的具體原理是什麼,我們帶著以下三個問題,去理解字串常數池:

字串常數池的設計意圖是什麼?

字串常數池在哪裡?

如何操作字串常數池?

字串常數池的設計想法

a、字串的分配,和其他的物件分配一樣,耗費高昂的時間與空間代價,作為最基礎的資料類型,大量頻繁的創建字串,極大程度地影響程式的效能。

b、JVM為了提高效能和減少記憶體開銷,在實例化字串常數的時候進行了一些最佳化。

為字串開啟一個字串常數池,類似於快取區。

在建立字串常數時,首先堅持字串常數池是否存在該字串。

存在該字串,傳回引用實例,不存在,實例化該字串並放入池中。

c、實現的基礎

實現此最佳化的基礎是因為字串是不可變的,可以不用擔心資料衝突進行共享。

執行階段實例所建立的全域字串常數池中有一個表,總是為池中每個唯一的字串物件維護一個參考,這就表示它們一直引用著字串常數池中的對象,所以,在常量池中的這些字串不會被垃圾收集器回收。

程式碼:從字串常數池中取得對應的字串

  String str1 = “hello”;
  String str2 = “hello”;
  System.out.printl("str1 == str2" : str1 == str2 ) //true

#字串常數池在哪裡

在分析字串常數池的位置時,先了解堆疊、堆疊、方法區:

Java中字串常數池的詳解

堆疊

##儲存的是對象,每個對像都包含一個與之對應的class

JVM只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身

物件的由垃圾回收器負責回收,因此大小和生命週期不需要確定

堆疊

每個執行緒包含一個堆疊區,堆疊中只保存基礎資料類型的物件和自訂物件的參考(不是物件)

每個堆疊中的資料(原始類型和物件參考)都是私有的

堆疊分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)

資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會自動消失

方法區

靜態區,跟堆一樣,被所有的執行緒共享

方法區包含的都是在整個程式中永遠唯一的元素,如class,static變數

字串常數池則存在於方法區

程式碼:堆疊方法區儲存字串

String str1 = “abc”;
String str2 = “abc”;
String str3 = “abc”;
String str4 = new String(“abc”);
String str5 = new String(“abc”);

Java中字串常數池的詳解

字串物件的建立

訪談問題:String str4 = new String(“abc”) 建立多少個物件?

1.在常數池中尋找是否有「abc」物件

有則傳回對應的參考實例

#沒有則建立對應的實例物件

2.在堆中new 一個String("abc") 物件

3.將物件位址賦值給str4,建立一個引用

所以,常數池中沒有「abc」字面量則建立兩個對象,否則建立一個對象,以及建立一個引用

根據字面量,往往會提出這樣的變式題:

String str1 = new String("A" " B") ; 會建立多少個物件? 

String str2 = new String("ABC") "ABC" ; 會建立多少個物件?

str1:

字串常數池:"A","B","AB" : 3個
堆:new String("AB") :1個
引用: str1 :1個
總共: 5個

str2 :

字串常數池:"ABC" : 1個
堆:new String("ABC") :1個
引用: str2 :1個
總共: 3個

程式碼:基礎型別的變數和常數,變數和參考儲存在堆疊中,常數儲存在常數池中

int a1 = 1;
int a2 = 1;
int a3 = 1;
public static int INT1 =1 ;
public static int INT2 =1 ;
public static int INT3 =1 ;

Java中字串常數池的詳解

# #操作字串常數池的方式JVM實例化字串常數池時

  String str1 = “hello”;
  String str2 = “hello”;
  System.out.printl("str1 == str2" : str1 == str2 ) //true

String.intern()

通过new操作符创建的字符串对象不指向字符串池中的任何对象,但是可以通过使用字符串的intern()方法来指向其中的某一个。java.lang.String.intern()返回一个保留池字符串,就是一个在全局字符串池中有了一个入口。如果以前没有在全局字符串池中,那么它就会被添加到里面

// Create three strings in three different ways.
    String s1 = "Hello";
    String s2 = new StringBuffer("He").append("llo").toString();
    String s3 = s2.intern();
    // Determine which strings are equivalent using the ==
    // operator
    System.out.println("s1 == s2? " + (s1 == s2)); // false
    System.out.println("s1 == s3? " + (s1 == s3)); // true

字面量和常量池初探

字符串对象内部是用字符数组存储的,那么看下面的例子:

String m = "hello,world";
String n = "hello,world";
String u = new String(m);
String v = new String("hello,world");

1.会分配一个11长度的char数组,并在常量池分配一个由这个char数组组成的字符串,然后由m去引用这个字符串

2.用n去引用常量池里边的字符串,所以和n引用的是同一个对象

3.生成一个新的字符串,但内部的字符数组引用着m内部的字符数组

4.同样会生成一个新的字符串,但内部的字符数组引用常量池里边的字符串内部的字符数组,意思是和u是同样的字符数组

使用图来表示的话,情况就大概是这样的(使用虚线只是表示两者其实没什么特别的关系):

Java中字串常數池的詳解


测试demo:

 String m = "hello,world";        
 String n = "hello,world";        
 String u = new String(m);        
 String v = new String("hello,world");        
 System.out.println(m == n); //true         
 System.out.println(m == u); //false        
 System.out.println(m == v); //false        
 System.out.println(u == v); //false

结论:

m和n是同一个对象

m,u,v都是不同的对象

m,u,v,n但都使用了同样的字符数组,并且用equal判断的话也会返回true

以上是Java中字串常數池的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:java面试笔试微信公众号。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用