专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » string字符串输入:java对String字符串对象的创建以及管理 »正文

string字符串输入:java对String字符串对象的创建以及管理

来源: 发布时间:星期三, 2008年10月1日 浏览:124次 评论:0
新手初学,不对的地方大家多多指教~

经常看到很多人讨论java中关于String的问题,我也就有点兴趣了,鉴于网上很多人写的都差别很大,
同样的问题都是不同的说法,我很迷糊,花了一晚上读了Java Virtual Machine Specification和
The Java Language Specification的一些章节,做了很多试验,总结了一下关于String的内容,还
有很多内容我也不确定,在下面也都提出来了,希望高手能指正.


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....

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: