十七字符串常量池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的主要内容,如果未能解决你的问题,请参考以下文章