Java 的基本类型都是池化存储的,最奇怪的动物 —— String 也有基本类型的特性。
intern()方法是当String被new出来后,在heap中存在时,如果调用,则放入池中。
public static void main(String[] args) {
String s = new String("1");
s = s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
String s4 = "11";
s3 = s3.intern();
System.out.println(s3 == s4);
String s5 = new String("123");
s5 = s5.intern();
String s6 = "123";
System.out.println( s5 == s6 );
}
上述代码全部返回true,原因是在调用intern时池中已经存在了,所以这个引用不会再放入池中。
紧紧跟随inern的定义:
- 直接使用双引号声明出来的
String
对象会直接存储在常量池中。 - 如果不是用双引号声明的
String
对象,可以使用String
提供的intern
方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中
这里有一篇更详细的介绍:http://www.importnew.com/14142.html