文章目录
1. 常量池与串池的关系
- 1:先把这段代码的二进制字节码进行反编译
- 2:反编译过后我们看类方法定义部分、虚拟机指令、常量池
类方法定义
虚拟机指令
常量池
在代码运行的过程中,常量池中的信息,都会被加载到运行时常量池中,我们可以看到这时a b ab 都是常量池中的符号,还没有变成Java字符串对象,只有在执行到具体引用它的那行代码上才会变成对象(懒惰模式),比如:String s1 = “a”;其实它代表的就是虚拟机指令中的:0: ldc #2 // String a
对于上面的补充:在开始创建出一个字符串对象的时候,还需要做一件事情—准备一块空间:StringTable[](串池) 刚开始它时空的没有内容,先去常量池中找到a这个符号,然后把它作为一个key去StringTable[]中找,看有没有取值相同的key,没有的话就会创建这个字符串"a"并且将它放入串池。
StringTable[]在结构上其实是一个hash表,且长度固定,不能扩容
- tip
这个 LocalVariableTable其实就是当前当前正在运行的这个main方法的栈帧运行时的局部变量表,其里面存储的就是局部变量
下图中的虚拟机指令的作用就是把生成的字符串对象存入这个局部变量表中去,且在表中每个变量都有编号。
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是存