java字元串常量池
package atguigu.demo1;
public class StringPool58Demo {
public static void main(String[] args) {
String str1 = new StringBuilder("58").append("tongcheng").toString();
System.out.println(str1);
/**
1、str1.intern():(1)本地方法
(2)如果字元串常量池中已經包含了一個等于此String對象的字元串,則傳回常量池中得到這個字元串對象的引用
如果沒有則加入字元串常量池
(3)注意進入intern()源碼看注釋
2、System[進入源碼看注釋可知] ----》initializeSystemClass()[方法裡面有一個sun.misc.Version.init();] --->進入init()方法----->
是一個Version類,裡面有一個 private static final String launcher_name = "java";靜态常量。
3、sun.misc:這個包是在bootstrap根加載器加載位元組碼檔案的時候,就把這個包下的類都加載進去,包含:Object類。String類等
4、是以、下面的java字元串才會出現false,一個是你自己建立的,一個是jvm開始時就加載進去的
**/
System.out.println(str1.intern());
System.out.println(str1==str1.intern());
System.out.println();
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2);
System.out.println(str2.intern());
/**
這個為false的原因:有一個初始化的java字元串(jdk從娘胎自帶的)
在加載sun。misc.version這個類的時候進入的常量池
**/
System.out.println(str2==str2.intern());
}
}
結果:
58tongcheng
58tongcheng
true
java
java
fals