(1)常量池
方法区的组成中都由一个叫做运行时常量池的部分,内部包含一个叫做StringTable的东西
反编译二进制字节码:
类的基本信息:
常量池:
方法定义:
构造方法
main方法 :方法中有一些指令,通过指令 #2去常量池中找这个静态指令
常量池:#2它是要找java/lang/System类下的out变量,类型是java/io/PrintStream
ldc:
invokevirtual #4:
通过常量池总用:就是给我们这些指令提供一些常量符号根据这个常量符号去一查找的方式去找到它
(2)运行时常量池
常量池运行时放到内存里,在内存中的位置叫做运行时常量池
(3)StringTable_面试题
StringTable是我们常说的串池
(4)StringTable_常量池和串池的关系
反编译:查看常量池 是什么样子:
astore_1是把a这个常量存到1号的局部变量
LocalVariableTable:是main方法栈帧运行时局部变量表
是main方法栈帧运行时局部变量表的变量s1编号是1
StringTable [ ] 数据结构上是一个哈希表,长度是固定的,不能扩容的
当ldc #2 执行这个指令会把a变成字符串对象,同时准别一个空间StringTable[] 串池,把a作为key去StringTable中找有没有这个,没有的话放a对象放入串池
(5)StringTable_字符串变量拼接
反编译查看main方法中的指令:
#5:创建StringBuild对象
#6:调用StringBuild的无参构造
aload1:是把参数s1加载进来
#7:调用StringBuild的append方法
#8:调用StringBuild对的toString方法
astore4:是把toString转换后的结果存入4号的局部变量s4中
StringBuild中toString方法内部是new 了一个String(ab)的对象,s4是存在堆中的,s3是串池中的是两个对象