String Table:Java中String类型的存储位置

Stirng的基本特征

  1. String声明为fianl,是不可被继承的;
  2. String实现了Serializable接口:字符串支持序列化;
  3. String实现了Comparable接口:String可比较大小;
  4. 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发展史

  • 内存位置
  1. jdk6及之前,String Table存放永久代中;

  2. jdk7把其中的静态变量、运算时常量池中的String Table 放到了堆中 :因为永久代的回收效率很低(full gc时才会触发)而开发中有大量字符串被创建

  • StringTable长度设置
  1. JDK6中StringTable默认长度1009,如果常量池中字符串过多就会导致效率下降;(StringTableSize设置没有要求)

  2. JDK7中StringTable长度默认600013,同样StringTableSize设置没有要求

  3. JDK8开始,StringTable不再是固定的,1009是它的最小值


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