常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括
字符串
常量,如String s = "java"这种申明方式。常量池是在堆内存中的一块。
常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及
数组)的常量值外,还包含一些以
文本形式出现的符号引用,比如:类和接口的全限定名、字段的名称和描述符、方法和名称和描述符。
class文件有
11种常量表:
常量表类型
|
标志值(占1 byte)
|
描述
|
CONSTANT_Utf8
|
1
|
UTF-8编码的
Unicode字符串
|
CONSTANT_Integer
|
3
|
int类型的字面值
|
CONSTANT_Float
|
4
|
float类型的字面值
|
CONSTANT_Long
|
5
|
long类型的字面值
|
CONSTANT_Double
|
6
|
double类型的字面值
|
CONSTANT_Class
|
7
|
对一个类或接口的符号引用
|
CONSTANT_String
|
8
|
String类型字面值的引用
|
CONSTANT_Fieldref
|
9
|
对一个字段的符号引用
|
CONSTANT_Methodref
|
10
|
对一个类中方法的符号引用
|
CONSTANT_InterfaceMethodref
|
11
|
对一个接口中方法的符号引用
|
CONSTANT_NameAndType
|
12
|
对一个字段或方法的部分符号引用
|
八种基本类型的包装类和对象池
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池。
参考:百度百科-常量池-http://baike.baidu.com/view/8680346.htm