Stirng的基本特征
- String声明为fianl,是不可被继承的;
- String实现了Serializable接口:字符串支持序列化;
- String实现了Comparable接口:String可比较大小;
- String在JDK8及之前存储数据使用 final char[] value, JDK9时改用 byte[],节约了一些空间
String内存分配
String对象创建方式
一般创建String对象有两种方式:
- String str1 =“aa”;
- String str2 = new String(“hello”);
其内存分配如下:
直接赋值:若是常量池不存在就创建并且str1直接指向常量池对应字符串;
用new方式创建:先在堆中创建一个实例对象,然后实例对象再去常量池中寻找/创建对应字符串。
String Table(字符串常量池)
String Table是真正存放字符串的地方,通过对象指针调用,StringT able中不会存放相同内容的字符串;
String Table发展史
- 内存位置
-
jdk6及之前,String Table存放永久代中;
-
jdk7把其中的静态变量、运算时常量池中的String Table 放到了堆中 :因为永久代的回收效率很低(full gc时才会触发)而开发中有大量字符串被创建
- StringTable长度设置
-
JDK6中StringTable默认长度1009,如果常量池中字符串过多就会导致效率下降;(StringTableSize设置没有要求)
-
JDK7中StringTable长度默认600013,同样StringTableSize设置没有要求
-
JDK8开始,StringTable不再是固定的,1009是它的最小值