String -- intern 方法详解

这个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就是看前后两个是不是相等,==则看是不是自己

  

原文地址:https://www.cnblogs.com/AmoryWang-JavaSunny/p/6407996.html