String Constant Pool字符串常量池代碼示例
一、核心概念(通俗解釋)
可以把字符串常量池理解成一個(gè)「字符串緩存池」:
- 當(dāng)你創(chuàng)建字符串(比如
String s = "hello")時(shí),JVM 會(huì)先去常量池里找有沒有內(nèi)容為"hello"的字符串。 - 如果有,直接返回這個(gè)字符串的引用(相當(dāng)于「復(fù)用」);如果沒有,就先在常量池里創(chuàng)建
"hello",再返回引用。 - 而通過
new String("hello")創(chuàng)建的字符串,會(huì)在 堆內(nèi)存 新建對象,同時(shí)常量池里也會(huì)創(chuàng)建"hello"(如果之前沒有),這也是為什么new String會(huì)比直接賦值多占用內(nèi)存。
二、代碼示例:直觀理解常量池機(jī)制
public class StringConstantPoolDemo {
public static void main(String[] args) {
// 方式1:直接賦值,字符串存入常量池,復(fù)用已有對象
String s1 = "hello";
String s2 = "hello";
// 方式2:new 創(chuàng)建,堆內(nèi)存新建對象,常量池仍會(huì)存"hello"(若不存在)
String s3 = new String("hello");
String s4 = new String("hello");
// 對比引用(== 比較對象地址,equals 比較內(nèi)容)
System.out.println(s1 == s2); // true:s1和s2指向常量池同一個(gè)"hello"
System.out.println(s1 == s3); // false:s1指向常量池,s3指向堆內(nèi)存對象
System.out.println(s3 == s4); // false:s3和s4是堆里兩個(gè)不同對象
System.out.println(s1.equals(s3)); // true:內(nèi)容相同
// intern() 方法:將堆中的字符串對象"入池",返回常量池引用
String s5 = s3.intern();
System.out.println(s1 == s5); // true:s5現(xiàn)在指向常量池的"hello"
}
}三、關(guān)鍵知識點(diǎn)
- 存儲(chǔ)位置:
- JDK 1.6 及之前:常量池位于 方法區(qū)(永久代);
- JDK 1.7 及之后:常量池被移到 堆內(nèi)存(更靈活,避免永久代內(nèi)存溢出)。
- 核心方法:intern ()
- 作用:將當(dāng)前字符串對象的內(nèi)容存入常量池(若不存在),并返回常量池中的引用;
- 場景:當(dāng)需要復(fù)用動(dòng)態(tài)生成的字符串(比如拼接后的字符串)時(shí),用
intern()可優(yōu)化內(nèi)存。
- 字符串拼接的特殊情況:
String s1 = "a" + "b"; // 編譯期優(yōu)化,直接等同于"ab",存入常量池
String s2 = "ab";
System.out.println(s1 == s2); // true
String a = "a";
String b = "b";
String s3 = a + b; // 運(yùn)行期拼接,會(huì)new String("ab"),存在堆中
System.out.println(s3 == s2); // false
System.out.println(s3.intern() == s2); // true四、實(shí)際應(yīng)用價(jià)值
- 內(nèi)存優(yōu)化:避免大量重復(fù)字符串占用內(nèi)存(比如業(yè)務(wù)中頻繁使用的固定字符串,如 "success"、"fail");
- 性能提升:復(fù)用已有對象減少 GC(垃圾回收)壓力,字符串比較時(shí)
==比equals更快(但僅適用于常量池字符串)。
總結(jié)
- 字符串常量池是 JVM 優(yōu)化字符串內(nèi)存的緩存機(jī)制,直接賦值的字符串會(huì)優(yōu)先存入常量池并復(fù)用;
new String()會(huì)在堆創(chuàng)建新對象,可通過intern()方法將內(nèi)容入池復(fù)用;- JDK 1.7 后常量池移至堆內(nèi)存,拼接字符串的編譯期 / 運(yùn)行期處理邏輯不同,需注意引用對比的差異。
到此這篇關(guān)于String Constant Pool字符串常量池代碼示例的文章就介紹到這了,更多相關(guān)String Constant Pool字符串常量池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java map轉(zhuǎn)Multipart/form-data類型body實(shí)例
這篇文章主要介紹了java map轉(zhuǎn)Multipart/form-data類型body實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Spring 中如何根據(jù)環(huán)境切換配置 @Profile
這篇文章主要介紹了Spring中如何根據(jù)環(huán)境切換配置@Profile的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot中多個(gè)實(shí)現(xiàn)的接口正確注入的六種方式
在SpringBoot中,正確注入多個(gè)接口實(shí)現(xiàn)包括使用@Autowired和@Qualifier、@Resource注解、構(gòu)造方法注入、@Primary注解、Java配置類以及將所有實(shí)現(xiàn)注入到List或Map中,感興趣的可以了解一下2024-10-10
淺談Java中對類的主動(dòng)引用和被動(dòng)引用
這篇文章主要介紹了淺談Java中對類的主動(dòng)引用和被動(dòng)引用,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
gitlab-runner結(jié)合docker部署項(xiàng)目全過程
本文介紹了使用GitLab和GitLab Runner自動(dòng)化構(gòu)建Spring Boot項(xiàng)目的方法,搭建好GitLab和GitLab Runner后,在Spring Boot項(xiàng)目中創(chuàng)建.gitlab-ci.yml文件,配置腳本準(zhǔn)備Maven編譯項(xiàng)目、打包JAR包及運(yùn)行JAR包,并在設(shè)置中配置CI/CD,這樣,點(diǎn)擊項(xiàng)目CI/CD即可自動(dòng)化運(yùn)行2026-05-05

