java常量池是如何存放基本类型字面量的?和String 的处理方式是一样的吗?常量池的设计原则是什么?
public class Test
{
public final int a=5;
public final int b=5;
public final int c=5;
String d="abc";
String e="abc";
String f="abc";
}
常量池在存储 基本类型的字面量 ,和存储字符串 的存储方式是否一样,
比如说 字符串
"abc" ,在常量池中只存储一份,
那么基本类型 字面量 比如说上面定义的
5 , 他会在编译 在常量池中存储几个?
java常量池有什么设计原则吗?
希望看懂我的意思,真正研究过jvm 的高手回答问题,谢谢!
------解决方案--------------------5也存储一份喽,String都是存储一份,基本类型更是这样。
类似你的代码,到class文件的路径下执行如下的命令,我的类名是T:
看const #8就知道了,后续 5: iconst_5 6: putfield #20; //Field a:I是对a赋值。
E:\workbench\back\bin>javap -verbose T
Compiled from "T.java"
public class T extends java.lang.Object
SourceFile: "T.java"
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // T
const #2 = Asciz T;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz a;
const #6 = Asciz I;
const #7 = Asciz ConstantValue;
const #8 = int 5;
const #9 = Asciz b;
const #10 = Asciz c;
const #11 = Asciz d;
const #12 = Asciz Ljava/lang/String;;
const #13 = Asciz e;
const #14 = Asciz f;
const #15 = Asciz <init>;
const #16 = Asciz ()V;
const #17 = Asciz Code;
const #18 = Method #3.#19; // java/lang/Object."<init>":()V
const #19 = NameAndType #15:#16;// "<init>":()V
const #20 = Field #1.#21; // T.a:I
const #21 = NameAndType #5:#6;// a:I
const #22 = Field #1.#23; // T.b:I
const #23 = NameAndType #9:#6;// b:I