intern() 方法返回字符串对象的规范化表示形式。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
具体不做介绍,请看引用:http://www.runoob.com/java/java-string-intern.html
来一段有意思东西:
//1:
String s1 = new StringBuilder("go").append("od").toString();
System.out.println(s1.intern() == s1);
//2:
String s0 = "good";
String s2 = new StringBuilder("go").append("od").toString();
System.out.println(s2.intern() == s2);
//3:
String s3 = new StringBuilder("ja").append("va").toString();
System.out.println(s3.intern() == s3);
结果1:true; 结果2:false; 结果3:false;
第一次看见这个的小伙伴是不是,瞬间看到了三个字母'WTF',代码一样的,只是值不一样吧。
结果1:s1.intern()发现"good"在常量池中不存在,则指向了s1;此时结尾声明一个"good" 在常量池中创建,则会直接指向s1;
结果2:s0已经在常量池创建了"good",所以s2.intern()直接指向了s0,堆中的s2与s0对比自然false;
结果3:看上去是结果1,但实际上这就是结果2,因为有些关键词在JDK中就已经在常量池中创建了。
注:在你的程序启动时,就已经装载来很多class
,这里面也有字符常量的创建,只是不是你自己创建的,你只是不知道而已。
在一个已实例化的String对象上调用intern()方法后,虚拟机会在String缓冲池内寻找与此Stirng对象所封装的字符串内容相同值的String对象,然后把引用赋值给引用原来的那个String对象的String类型变量。如果String缓冲池内没有与此String对象所封装的字符串内容相同值的String对象存在,那么虚拟机会为此创建一个新的String对象,并把其引用赋值给引用原来的那个String对象的String类型变量
采用new 创建的字符串对象不进入字符串池
字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量则不会进入字符串池中
intern()有两个作用,第一个是将字符串字面量放入常量池(如果池没有的话),第二个是返回这个常量的引用
如果不能理解,推荐一个博文:https://blog.csdn.net/SEU_Calvin/article/details/52291082 让你豁然开朗