public static void main(String[] args) {
String s1 = new StringBuilder("ja").append("va").toString();
show(s1.intern(), s1);
String s2 = new StringBuilder("py").append("thon").toString();
show(s2.intern(), s2);
String s3 = new StringBuilder("he").append("llo").toString();
show(s3.intern(), s3);
}
返回结果是什么?
false (没错,你没有看错是 false,的确是false)
true
true
public native String intern();
如果一个字符串对象在常量池中不存在,就复制一份到常量池中但是返回的还是该对象的引用
如果一个字符串对象在常量池中已经存在,就直接返回常量池中对象的引用
所以这里返回true是因为,常量池中不含有该字符串所以直接返回该对象的引用这是没问题的
为什么返回了false了呢?
这是因为java虚拟机默认字符串常量池里面有 “java”,“int”,"double"等字符串,所以这些字符串返回的是字符串常量池中的对象地址而不是堆内存中的地址,因此返回false