首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java常量池是怎么存放基本类型字面量的?和String 的处理方式是一样的吗?常量池的设计原则是什么

2013-06-26 
java常量池是如何存放基本类型字面量的?和String 的处理方式是一样的吗?常量池的设计原则是什么?public cl

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>

热点排行