代码如下,请问为啥会是这种情况?
public class Main {
public static void main(String[] args) {
test1();
test2();
}
public static void test1() {
String x = "x";
String y = "y";
String a = x + y;
String c = a.intern();
String b = "xy";
System.out.println(a == c); //输出true
}
public static void test2() {
String x = "x";
String y = "y";
String a = x + y;
String b = "xy";
String c = a.intern();
System.out.println(a == c); //输出false
}
}
输出如下:
true
false
简单说下吧
String.intern() 就是手动把对象放进常量池中
说明下这个解释是针对于JDK8,7和8还是有区别的
方法一
String a = x + y //字符串拼接 在堆中
String c = a.intern(); //c是 "xy"放进常量池中,应用堆中对象地址
String b = "xy"; //拿常量池中和c一样 指向堆中xy对象地址。
System.out.println(a == c); //true,c虽然是来自常量池引用还是堆中xy对象地址。
方法二
public static void test2() {
String x = "x";
String y = "y";
String a = x + y;//a是堆中xy地址
String b = "xy"; //常量池中xy
String c = a.intern();//"xy"是否已经在常量池中存在,存在,拿常量池xy地址 c是常量池xy地址
System.out.println(a == c); //输出false a是堆中 c是常量池 false
}