class A {
String s4 = "abc";
static public void main(String[]args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
A o = new A();
String s5 = new String("def");
System.out.println("s1==s2 : " + (s1==s2));
System.out.println("s1==s1.intern : " + (s1==s1.intern()));
System.out.println("s1==s3 : " + (s1==s3));
System.out.println("s1.intern==s3.intern : " + (s1.intern()==s3.intern()));
System.out.println("s1==s4 : " + (s1==o.s4));
}
}
輸出:的Java:文字字符串
s1==s2 : true
s1==s1.intern : true
s1==s3 : false
s1.intern==s3.intern : true
s1==s4 : true
我的問題:
1.什麼發生了"String s1 = "abc"
?我猜字符串對象被添加到類String中的池作爲一個interned字符串?它放在哪裏? 「永久代」或只是堆(作爲String類實例的數據成員)?
2. "String s2 = "abc"
發生了什麼?我猜想沒有任何對象被創建。但這是否意味着Java Intepreter需要搜索所有被攔截的字符串?這會導致任何性能問題?
3.Seems String s3 = new String("abc")
不使用interned string.Why?
4.請問String s5 = new String("def")
創建任何新的interned字符串?
謝謝mate.Your答案看起來不錯。還有一個問題:如果文字被寫入類文件的「常量池」部分,2個類中的2個文字(相同內容)如何使用相同的實際字符串? –
@DonLi - 常量池是類文件的一部分。 classfile規範不允許一個類文件引用另一個類文件的常量池。 –