package string;
public class StringInternMethodPractice1 {
public static void main(String[] args) {
StringBuilder stringBuilder2 = new StringBuilder("計(jì)算機(jī)軟件");
String str2 = stringBuilder2.toString();
String str3 = str2.intern();
// 加載這個(gè)類(lèi)的時(shí)候,Class文件中的常量池加載到運(yùn)行時(shí)常量池,運(yùn)行時(shí)常量池有”計(jì)算機(jī)軟件“這個(gè)常量(以char數(shù)組的形式存在)
// 然后會(huì)在堆中生成一個(gè)字符串對(duì)象,字符串對(duì)象中的char數(shù)組指向運(yùn)行時(shí)常量池中的”計(jì)算機(jī)軟件“
// 最后在字符串常量池記錄一下這個(gè)字符串對(duì)象的引用
// 調(diào)用str2.intern()方法時(shí),會(huì)首先判斷str2指向的字符串對(duì)象里的字符串是否首次出現(xiàn)在運(yùn)行時(shí)常量池
// 這里非首次出現(xiàn),所以會(huì)將字符串常量池中記錄的引用返回給str3
// 雖然str3和str2指向的字符串對(duì)象都是在堆上,但是并非同一個(gè)對(duì)象,所以比較為false
System.out.println(str3 == str2);
}
}
圖示解析

字符串常量池,運(yùn)行時(shí)常量池,靜態(tài)常量池.png