日期:2014-05-20  浏览次数:20726 次

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