知识大全 Java对String字符串对象的创建以及管理
Posted 常量
篇首语:事常与人违,事总在人为。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java对String字符串对象的创建以及管理相关的知识,希望对你有一定的参考价值。
Java对String字符串对象的创建以及管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
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 章节
对于Constant Pool 表的基本通用结构为:
>
tag是一个数字 用来表示存储的常量的类型 例如 表示String类型 表示Long类型 info[]根据
类型码tag的不同会发生相应变化
对于String类型 表的结构为:
>
tag固定为 string_index是字符串内容信息 类型为:
>
tag固定为 length为字符串的长度 bytes[length]为字符串的内容
(以下代码在jdk 中编译)
为了详细理解Constant Pool的结构 我们参看一些代码:
>
由于 sss 和 sss 都是字符串常量 在编译期就已经创建好了存储在class文件中
在编译后的class文件中会存在这 个常量的对应表示:
>
根据上面说的String常量结构 我们分析一下
开始的 为CONSTANT_String_info结构中的tag 而 应该是它的相对引用 为CONSTANT_Utf _info的tag 为对应字符串的长度 为字符串对应的编码 接着分析 会发现后面的是对应 sss 的存储结构
经过上面分析 我们知道了 和 是两个字符串的相对引用 就可以修改class文件来修改打印的内容 把class文件中的 E C D改成 E C D 程序就会输出sss sss 而不是和原程序一样输出sss sss 因为我们把对 sss 的相对引用 改成了对 sss 的相对引用
>
在上面程序中存在 个相同的常量 sss 对于n个值相同的String常量 在Constant Pool中只会创建一个 所以在编译好的class文件中 我们只能找到一个对 sss 的表示:
>
在程序执行的时候 Constant Pool会储存在Method Area 而不是heap中
另外 对于 内容为空的字符串常量 会创建一个长度为 内容为空的字符串放到Constant Pool中
而且Constant Pool在运行期是可以动态扩展的
关于String类的说明
String使用private final char value[]来实现字符串的存储 也就是说String对象创建之后 就不能再修改此对象中存储的字符串内容 就是因为如此 才说String类型是不可变的(immutable)
String类有一个特殊的创建方法 就是使用 双引号来创建 例如new String( i am )实际创建了 个
String对象 一个是 i am 通过 双引号创建的 另一个是通过new创建的 只不过他们创建的时期不同
一个是编译期 一个是运行期!
java对String类型重载了+操作符 可以直接使用+对两个字符串进行连接
运行期调用String类的intern()方法可以向String Pool中动态添加对象
String的创建方法一般有如下几种
直接使用 引号创建
使用new String()创建
使用new String( someString )创建以及其他的一些重载构造函数创建
使用重载的字符串连接操作符+创建
例
>
例
>
例
>
例
这个是The Java Language Specification中 节的例子 有了上面的说明 这个应该不难理解了
>
输出结果为true true true true false true 请自行分析!
结果上面分析 总结如下:
单独使用 引号创建的字符串都是常量 编译期就已经确定存储到String Pool中
使用new String( )创建的对象会存储到heap中 是运行期新创建的
使用只包含常量的字符串连接符如 aa + aa 创建的也是常量 编译期就能确定 已经确定存储到String Pool中
使用包含变量的字符串连接符如 aa + s 创建的对象是运行期才创建的 存储在heap中
使用 aa + s 以及new String( aa + s )形式创建的对象是否加入到String Pool中我不太确定 可能是必须调用intern()方法才会加入 希望高手能回答!
还有几个经常考的面试题:
>
> cha138/Article/program/Java/ky/201311/28198
相关参考
Assembly的CreateInstance有三个重载第一个参数需要是一个字符串表示的完整的类名第二个参数是一个bool类型如果为true表示对第一个参数不区分大小写 第三个影响执行搜索的方式
打破Java定律:无需创建对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们知道在Java
//为String对象原型添加trim方法去掉字符串前后的空格Stringprototypetrim=function() //用正则表达式将前后空格用空字符串替
知识大全 String和stringBuffer类字符串的区别
String和stringBuffer类字符串的区别 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java网络编程从入门到精通(25):创建ServerSocket对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶
关于String对象解析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! <PREclass
从技术角度说OOP(面向对象程序设计)只是涉及抽象的数据类型继承以及多形性但另一些问题也可能显得非常重要本节将就这些问题进行探讨 最重要的问题之一是对象的创建及破坏方式对象需要的数据位于哪儿如何
Java比c++方便的一点就是java有自己的垃圾收集机制可以自动帮你收集垃圾但是这并非意味着使用java我们就不需要考虑内存管理了 这一点相信很多java程序员都是知道的就是当一个对象我们决定
Java当中的String数据类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中St
深入了解Java的String 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一从根本上认识ja