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规范不允许一个类文件引用另一个类文件的常量池。 –