首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>JAVA技术>正文

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

http://www.oklinux.cn  2008-10-09  赛迪网 whutfirefox  会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

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"的存储结构。

经过上面分析,我们知道了11和13是两个字符串的相对引用,就可以修改class文件来修改打印的内容,把class文件中的00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D改成00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D,程序就会输出sss111 sss111,而不是和原程序一样输出sss111 sss222,因为我们把对"sss222"的相对引用12改成了对"sss111"的相对引用10。

public class Test {
    public static void main(String[] args) {
        String s1 = "sss111";
        String s2 = "sss111";
    }
}

在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:

              
共5页: 上一页 1 [2] [3] [4] [5] 下一页

上一篇:调查显示:数据中心五大趋势 其中Linux的增长很迅猛   下一篇:GNOME 3草图揭晓!

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Java应用:编写高级JavaScript应用代码
·实例教程:巧用Java 实现个性MSN聊天功能
·在java中产生随机数的两种方式过程详解
·JAVA高手帮你解析XML配置文件的读取操作
·java语言中异常错误恢复处理的异常类型
·使用Java程序连接各种数据库的方法介绍
·JSP动态网站环境搭建应用中详细步骤介绍
·利用Jsvc把Java程序嵌入到Linux服务中去
·在JSP环境中如何来配置和使用fckeditor
·Oracle数据库和JSP连接要注意的一些问题
·新手看招:JSP中表单数据存储的通用方法
·介绍JSP程序动态网站环境搭建的详细步骤
·实例解析:Jsp JavaBean循序渐进教程(一)
·介绍J2EE应用程序的授权概念和解决方案
·Java安全通信:为高级JSSE开发人员定制SSL
·J2EE探索者:用JAAS和JSSE实现Java安全性
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java应用:编写高级JavaScript应用代码
·实例教程:巧用Java 实现个性MSN聊天功
·在java中产生随机数的两种方式过程详解
·JAVA高手帮你解析XML配置文件的读取操
·java语言中异常错误恢复处理的异常类型
·使用Java程序连接各种数据库的方法介绍
·JSP动态网站环境搭建应用中详细步骤介
·利用Jsvc把Java程序嵌入到Linux服务中
·在JSP环境中如何来配置和使用fckeditor
·Oracle数据库和JSP连接要注意的一些问
·新手看招:JSP中表单数据存储的通用方法
·介绍JSP程序动态网站环境搭建的详细步
  阅读排行
·JAVA技术:AJAX jsp无刷新验证码实例
·JSP动态网站环境搭建应用中详细步骤介
·使用prototype.js写的读取RSS的例子
·实例教程:Java Socket编程的一个秘密类
·Java安全:运用加密技术保护Java源代码
·介绍JSP程序动态网站环境搭建的详细步
·利用Jsvc把Java程序嵌入到Linux服务中
·进阶教程:编写高级JavaScript应用代码
·在JSP环境中如何来配置和使用fckeditor
·J2EE探索者:用JAAS和JSSE实现Java安全
·使用Java程序连接各种数据库的方法介绍
·JAVA综合--如何掌握JDK1.5枚举类型
·Oracle数据库和JSP连接要注意的一些问
·新手看招:JSP中表单数据存储的通用方法
·JSP调用SQL server 2000的存储过程
网摘收藏: