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 的高手回答问题,谢谢! java??常量池??字面量 存储
[解决办法]
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
const #24 = Field #1.#25; // T.c:I
const #25 = NameAndType #10:#6;// c:I
const #26 = String #27; // abc
const #27 = Asciz abc;
const #28 = Field #1.#29; // T.d:Ljava/lang/String;
const #29 = NameAndType #11:#12;// d:Ljava/lang/String;
const #30 = Field #1.#31; // T.e:Ljava/lang/String;
const #31 = NameAndType #13:#12;// e:Ljava/lang/String;
const #32 = Field #1.#33; // T.f:Ljava/lang/String;
const #33 = NameAndType #14:#12;// f:Ljava/lang/String;
const #34 = Asciz LineNumberTable;
const #35 = Asciz LocalVariableTable;
const #36 = Asciz this;
const #37 = Asciz LT;;
const #38 = Asciz SourceFile;
const #39 = Asciz T.java;
{
public final int a;
Constant value: int 5
public final int b;
Constant value: int 5
public final int c;
Constant value: int 5
java.lang.String d;
java.lang.String e;
java.lang.String f;
public T();
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0
1: invokespecial #18; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_5
6: putfield #20; //Field a:I
9: aload_0
10: iconst_5
11: putfield #22; //Field b:I
14: aload_0
15: iconst_5
16: putfield #24; //Field c:I
19: aload_0
20: ldc #26; //String abc
22: putfield #28; //Field d:Ljava/lang/String;
25: aload_0
26: ldc #26; //String abc
28: putfield #30; //Field e:Ljava/lang/String;
31: aload_0
32: ldc #26; //String abc
34: putfield #32; //Field f:Ljava/lang/String;
37: return
LineNumberTable:
line 2: 0
line 3: 4
line 4: 9
line 5: 14
line 7: 19
line 8: 25
line 9: 31
line 2: 37
LocalVariableTable:
Start Length Slot Name Signature
0 38 0 this LT;
}
E:\workbench\back\bin>