这个intern()官方说法的作用是返回字符串对象的规范化表示... 然而不明觉厉...
用我通俗一点说法其实就是,拿到一个字符串,那它到字符串常量池中去执行equals方法,如果返回为true,就代表,有相同的则返回字符串常量池里面的那个引用,若没有,则在字符串常量池里面创建一个这样的常量,这里就会包含运行时常量池的知识了,然后再返回新创建的在字符串常量池里面的引用
下面我po出些例子来
public class InternOfString { public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "ab"; String s4 = s1+s2; String s5 = new String("ab"); String s6 = "a" + "b"; String s7 = "a"+s2; System.out.println(s3.equals(s5)); System.err.println(s5.equals(s4)); System.out.println(s5.intern() == s3); System.out.println(s3 == s5); System.out.println(s4 == s5); System.out.println(s4 == s3); System.out.println(s4.intern() == s3); System.out.println(s3 == s6); System.out.println(s7 == s3); String s8 = new String("abc"); String s9 = new String("abc"); System.out.println(s8.equals(s9)); System.out.println(s8.intern() == s9); } }
依次的结果为 :
true
true
true
false
false
false
true
true
false
true
false
怎么说,字符串的equals 和 == 算是老生常谈的话题了,无非就是被分配的VM 区域不同的问题,
一点足以:只要字符串初始化中含有引用的,就肯定不会是被分配在字符串常量池中,而是会在类加载时,随机分配在方法区中,往大里说就是heap中,
,纯字符串的结合,例如 s1,s2, s3, s6,就会直接在字符串常量池中被分配。。。
剩下的intern方法就是去字符串找长得和自己一样的顶上去,equals就是看前后两个是不是相等,==则看是不是自己