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
相关文章
读者评论
发表评论 |