String的intern方法 是一个Native方法 它的作用是:如果字符串常量池中已经包含一个等于此string对象的字符串,则返回这个字符串对象 ;否则将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
intern方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用。
上面是jdk1.7的说明 在1.8中 用元空间来代替永久代
Open Declaration String java.lang.String.intern()
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by theclass String.
When the intern method is invoked, if the pool already contains astring equal to this String object as determined bythe equals(Object) method, then the string from the pool isreturned. Otherwise, this String object is added to thepool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.
All literal strings and string-valued constant expressions areinterned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.
Returns:a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.
public class PermGenTest {
public static void main(String[] args) {
String aa="abc";
String bb = aa.intern();
System.out.println(aa==bb); //true
String str1= new StringBuffer("jav").append("a").toString();
String str2 = str1.intern(); //intern 会把首次遇到的字符串实例复制到永久代中 上面的 str1 不是首次了 因为java是自带的 所以他们所指的地址不一样
System.out.println(str1==str2); //false
String aaa="java"; // 调用常量池中
System.out.println(aaa==str2); // true1
String s1= new StringBuffer("九三").append("班").toString();
String s2 = s1.intern();
System.out.println(s1==s2); //true
}
}
具体请参考:
https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html