常量池int和float的存储方式如下图所示
建一个测试类,声明了五个变量,但是取值就两种int类型的10和Float类型的11f
public class IntAndFloatTes{
private final int a = 10;
private final int b = 10;
private float c = 11f;
private float d = 11f;
private float e = 11f;
}
然后编译成IntAndFloatTest.class字节码文件,可以通过javap命令进行反解析,javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。进入到该代码的class文件目录,执行命令,javap -v IntAndFloatTest,结果如下图所示:可以看到虽然我们在代码中写了两次10 和三次11f,但是常量池中,就只有一个常量10 和一个常量11f。
从结果上可以看到常量池第13 个常量池项(cp_info) 就CONSTANT_Integer_info,值为10;第4个常量池项(cp_info) 就是CONSTANT_Float_info,值为11f。代码中所有用到 int 类型 10 的地方,会使用指向常量池的指针值13定位到第13个常量池项(cp_info),即值为10的结构体CONSTANT_Integer_info,而用到float类型的11f时,也会指向常量池的指针值#4来定位到第4个常量池项(cp_info) 即值为11f的结构体CONSTANT_Float_info。如下图所示