intern()函数是什么
new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。
下面直接看代码,进行展示
public class demo3 {
public static void main(String[] args) {
String s1="你好";
String s2="之华";
String s3="你好之华";
System.out.println((s1+s2)==s3); //false
System.out.println((s1+s2).intern()==s3); //true 因为用了intern() 将常量区的地址给了(s1+s2)
s1="你好"+"之华";
System.out.println(s1==s3); //true
s1=new String("你")+new String("之");
s1.intern();
s2="你之";
System.out.println(s1==s2); //true
String s4="你好";
String s5=new String("你好");
System.out.println(s4==s5); //false
s4="好";
s5=new String("好").intern();
System.out.println(s4==s5); //true
String s6=new String("你").intern();
String s7=new String("你").intern();
System.out.println(s6==s7); //true
s1="我";
s2=new String("我");
s2.intern();
System.out.println(s1==s2); //false 因为常量区已经有"我",所以用intern的时候不会再去创建
final String s8="爱";
String s9=s8+"你"; //因为final是常量,所以这句话会直接替换成String s9="爱"+"你";
String s10="爱你";
System.out.println(s10==s9); //true
}
}
总结:
1.“+”操作符,是直接进行字符串拼接,而 变量+“” 是调用的StringBuffer的append()方法在堆上创建的新对象
2.intern()是只有常量区没有的时候才会去创建,如果有了就不会创建
3.final修饰的常量,是会在编译阶段直接进行替换
4.String对象直接显示调用intern()方法也会在常量区创建对象
这个具体的掌握,还是需要自己实践一下,画一画图,就能明白了