十七字符串常量池StringTable

Posted 写代码不掉发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十七字符串常量池StringTable相关的知识,希望对你有一定的参考价值。

1、String的基本特性

String:字符串,使用一对""引起来表示。

  • String sl = "hello";//字面量的定义方式
  • String s2 = new String("hello") ;

String声明为final的, 不可被继承。

String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小。

String在jdk8及以前内部定义了final char[],value用于存储字符串数据。jdk9时改为byte[]

结论: String再也不用char[] 来存储,改成了byte[] 加上编码标记,节约了一些空间。StringBuffer和StringBuilder也做了一些修改。

1 public final class String implements java.io.Serializable, Comparable<String>,CharSequence {
2 @Stable
3 private final byte[] value;
4 }

 

String:代表不可变的字符序列。简称:不可变性。

当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

public class test{
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2); //true

        s1 = "hello";     //重新赋值
        System.out.println(s1 == s2);//false

        String s3 = "abc";    //字面量赋值
        System.out.println(s3 == s2);//true
        s3 += "def";    //拼接
        System.out.println(s3);//abcdef
        System.out.println(s3 == s2);//false

        String s4 = "hella";
        String s44 = s4.replace(\'a\',\'o\');    //replace()
        System.out.println(s44);   //hello
        System.out.println(s44 == s1); //fasle

        String s5 = new String("hello");    //new赋值
        System.out.println(s5 == s1); //false
    }
}

 

 

字符串常量池中是不会存储相同内容的字符串的。

String的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进StringPool的String非常多, 就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String. intern时性能会大幅下降。

使用一XX: StringTableSize可设置StringTable的长度

在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。StringTableSize设置没有要求

在jdk7中,StringTable的长度默认值是60013

jdk8开始,1009是StringTable长度可设置的最小值

2、String的内存分配

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于十七字符串常量池StringTable的主要内容,如果未能解决你的问题,请参考以下文章

13_StringTable

Day337&338.StringTable -JVM

JVM专题-StringTable

JVM专题-StringTable

理解StringTable

JVM--13---StringTable