java对String字符串对象的创建以及管理

文章关键字:|java|String|字符串|对象|创建||管理|class|数据|tag|

  Constant Pool常量池的概念:

  在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容。

  String Pool是对应于在Constant Pool中存储String常量的区域。习惯称为String Pool,也有人称为String Constant Pool。好像没有正式的命名。

  在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组组成的表,类型为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各种基本Java数据类型,详情参见The Java Virtual Machine Specification 4.4章节。对于Constant Pool,表的基本通用结构为:

cp_info {
u1 tag;
u1 info[];
}

  tag是一个数字,用来表示存储的常量的类型,例如8表示String类型,5表示Long类型,info[]根据类型码tag的不同会发生相应变化。对于String类型,表的结构为:

CONSTANT_String_info {
u1 tag;
u2 string_index;
}

  tag固定为8,string_index是字符串内容信息,类型为:

CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}

  tag固定为1,length为字符串的长度,bytes[length]为字符串的内容。 (以下代码在jdk6中编译) 为了详细理解Constant Pool的结构,我们参看一些代码:

String s1 = "sss111";
String s2 = "sss222";
System.out.println(s1 + " " + s2);

  由于"sss111"和"sss222"都是字符串常量,在编译期就已经创建好了存储在class文件中。 在编译后的class文件中会存在这2个常量的对应表示:

08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111....
00 06 73 73 73 32 32 32 ; ..sss222

  根据上面说的String常量结构,我们分析一下:

  开始的08为CONSTANT_String_info结构中的tag,而11应该是它的相对引用,01为CONSTANT_Utf8_info的tag,06为对应字符串的长度,73 73 73 31 31 31为字符串对应的编码,接着分析,会发现后面的是对应"sss222"的存储结构。


未完,原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9254
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值