先上以下代码:
public class Main {
public static void main(String[] args) throws Exception{
String a="ab";
String b=new String("ab");
String c="a"+"b";
String d="a";
String e=d+"b";
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==e);
System.out.println(a==b.intern());
}
}
输出结果如下:
false
true
false
true
为什么会有这种现象呢?因为对于java字符串来说,在编译的时候,可以确定的字符串都会写到java的静态内存区,即字符串常量池。而在写到字符串常量池的时候,如果常量池已经存在该字符串,则直接返回字符串引用。因此a和c是处于字符串常量池中的”ab”引用。而b和d则是处于堆中的字符串引用,故会产生以上结果。
而String.intern()就是把堆中的字符串写入到字符串常量中(同理如果已有则直接返回引用),故第四个输出为true。
事实上,java的静态内存区是可以通过类似String.intern()的方法把heap中的数据写入到静态区的。