美文网首页
String.intern

String.intern

作者: 其_cd6b | 来源:发表于2018-05-07 20:52 被阅读0次

    • 直接使用双引号声明出来的String对象会直接存储在常量池中。
    • 如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中

    JAVA 使用 jni 调用c++实现的StringTable的intern方法, StringTable的intern方法跟Java中的HashMap的实现是差不多的, 只是不能自动扩容。默认大小是1009。
    要注意的是,String的String Pool是一个固定大小的Hashtable,默认值大小长度是1009,如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降(因为要一个一个找)。
    在 jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。在jdk7中,StringTable的长度可以通过一个参数指定:
    • -XX:StringTableSize=99991

    public static void main(String[] args) {
    String s = new String("1");
    s.intern();
    String s2 = "1";
    System.out.println(s == s2);
    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);
    }

    jdk6 下false false
    jdk7 下false true

    jdk6.png.jpeg
    jdk7_1.png.jpeg

    从上述的例子代码可以看出 jdk7 版本对 intern 操作和常量池都做了一定的修改。主要包括2点:
    • 将String常量池 从 Perm 区移动到了 Java Heap区
    • String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。

    相关文章

      网友评论

          本文标题:String.intern

          本文链接:https://www.haomeiwen.com/subject/mbfbrftx.html