输出结果:s1 == s2
s1 equals s2
分析:先来说说intern()这个方法的作用吧,这个方法的作用是返回在字符串缓冲池中的对象的引用,所以s2指向的也是字符串缓冲池中的地址,和s1是相等的。
public static void main(String[] args) {
String Monday =
"Monday";
String Mon =
"Mon";
String day =
"day";
System.
out.println(Monday ==
"Mon" +
"day");
System.
out.println(Monday ==
"Mon" + day);
}
输出结果:true
false
分析:第一个为什么等于true我们已经说过了,因为两者都是常量所以在编译阶段就已经能确定了,在第二个中,day是一个变量,所以不能提前确定他的值,所以两者不相等,从这个例子我们可以看出,只有+连接的两边都是字符串常量时,引用才会指向字符串缓冲池,都则都是指向内存中的其他地址。
public static void main(String[] args) {
String Monday =
"Monday";
String Mon =
"Mon";
final String day =
"day";
System.
out.println(Monday ==
"Mon" +
"day");
System.
out.println(Monday ==
"Mon" + day);
}
输出结果:true
true
分析:加上final后day也变成了常量,所以第二句的引用也是指向的字符串缓冲池。
附录
java源码中对于String a = new String(”abc”);这种构造方法的实现
public String(String original) {
this.
value = original.
value;
this.hash = original.hash;
}
本文永久更新链接地址: