StringTable(串池)详解

本文详细介绍了Java中的StringTable(串池),包括常量池与串池的关系,字符串变量和常量拼接的原理,以及不同JDK版本下intern()方法的行为。讲解了StringTable的位置变迁,从JDK1.6的永久代到JDK1.8的堆空间,并探讨了StringTable的垃圾回收和性能调优,包括调整hashTable桶的个数以减少冲突,提高查找效率。
摘要由CSDN通过智能技术生成

1. 常量池与串池的关系

  • 1:先把这段代码的二进制字节码进行反编译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UPTOVZm-1651717989295)(https://note.youdao.com/yws/res/e/WEBRESOURCEd526d64244e564378b73df4cf167b4ce)]

  • 2:反编译过后我们看类方法定义部分、虚拟机指令、常量池
    类方法定义
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLJT1A9F-1651717989296)(https://note.youdao.com/yws/res/6/WEBRESOURCEb7a4d911eb3011c3ff596a432d67c4d6)]

虚拟机指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahO6gFBQ-1651717989296)(https://note.youdao.com/yws/res/f/WEBRESOURCEe107d598706cf4615a7796f6dc5fbd0f)]

常量池

在代码运行的过程中,常量池中的信息,都会被加载到运行时常量池中,我们可以看到这时a b ab 都是常量池中的符号,还没有变成Java字符串对象,只有在执行到具体引用它的那行代码上才会变成对象(懒惰模式),比如:String s1 = “a”;其实它代表的就是虚拟机指令中的:0: ldc #2 // String a

对于上面的补充:在开始创建出一个字符串对象的时候,还需要做一件事情—准备一块空间:StringTable[](串池) 刚开始它时空的没有内容,先去常量池中找到a这个符号,然后把它作为一个key去StringTable[]中找,看有没有取值相同的key,没有的话就会创建这个字符串"a"并且将它放入串池。

StringTable[]在结构上其实是一个hash表,且长度固定,不能扩容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9l4QDVDp-1651717989297)(https://note.youdao.com/yws/res/6/WEBRESOURCEf563f6fb4046ae12a9f0b6ba4dc675a6)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UFISJNk-1651717989298)(https://note.youdao.com/yws/res/4/WEBRESOURCEcdaa0c774d48fe36060a210d6c5f0784)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcHrEWKn-1651717989299)(https://note.youdao.com/yws/res/b/WEBRESOURCEd525bd7cad4c76af45e2e3ddf32e29db)]

  • tip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uIfFO3Pd-1651717989299)(https://note.youdao.com/yws/res/2/WEBRESOURCEe53b2c39e179b2b313b85edd02369ee2)]

这个 LocalVariableTable其实就是当前当前正在运行的这个main方法的栈帧运行时的局部变量表,其里面存储的就是局部变量

下图中的虚拟机指令的作用就是把生成的字符串对象存入这个局部变量表中去,且在表中每个变量都有编号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52Vmn7HB-1651717989299)(https://note.youdao.com/yws/res/5/WEBRESOURCEa6669ed476272715b68b62a9a3d890e5)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ozhhYb2M-1651717989300)(https://note.youdao.com/yws/res/0/WEBRESOURCEd58be8c7c67d85368fe3cf1272717b20)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1F1Kpha-1651717989302)(https://note.youdao.com/yws/res/b/WEBRESOURCE736855dead8a6330e516efd7e070493b)]

2. 字符串【变量】拼接的原理 StringBuilder

下图中的s4,首先给出结论,通过将二进制字节码反编译我们可以得出图中圈出部分结论

![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpabUICY-1651717989303)(https://note.youdao.com/yws/res/b/WEBRESOURCE87d705773f97fa577281e2ae1227d31b)\]](https://img-blog.csdnimg.cn/f8089247a96c4af8a8acdd1023bafc4a.png)

aload指令和astore指令相反,aload是从局部变量表中取,astore是存

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值