不同JDK版本的inter()方法区别

String s = new String ("a")
s.inter();

JDK6:当调用intern方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用。否则,将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。

JDK6+:当调用inter方法时,如果字符串常量池先前已创建出改字符串 对象,则返回池中的该字符串的引用。
否则如果该字符串对象已经存在于Java堆中,则将该堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在,则在池中创建该字符串并且返回其引用。

最大的区别也就是:JDK6+非但能往池中添加字符串对象,还能添加字符串对象在堆中的引用

public class InternDifference{
    public static void main(String[] args){
      String s = new String("a");
      s.intern();
      String s2 = "a";
      System.out.println(s == s2);

      String s3 = new String("a") + new String("a");
      s3.intern();
      String s4 = "aa";
      System.out.println(s3 == s4);

  }
}

JDK6 输出:
false
false

解析:
1.首先在new String(“a”)过程中,在堆创建了一个字符串对象为s ,同时向常量池中添加了 “a” 副本,这时intern()操作显然是执行不了的,而 String s2 = “a” 是直接引用的常量池中的副本,所以一个堆中对象的地址是不会等于一个常量池中副本的地址的,所以是false
2.同上

JDK6+输出:
false
true
解析:
1.同上题1
2.因为String s3 = new String(“a”) + new String(“a”); 在堆中生成 "aa"对象,此时"aa"并没,intern()方法将 "aa"在堆中的引用放入到常量池当中,String s4 = “aa” 这时 "aa"的引用为s3的堆对象地址,所以s4==s3为true


版权声明:本文为qq_42931883原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。