锁定老帖子 主题:理解java String
精华帖 (3) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-04
一、创建。
java 代码
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。看下面的例子:
java 代码
再看下面的例子:
java 代码
为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。
三、String的长度 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-05
写得不错~
|
|
返回顶楼 | |
发表时间:2007-01-05
String是非可变类的最大优势在于不用同步。
PS:写的不错啊(如果是原创的话),干嘛投新手贴阿 |
|
返回顶楼 | |
发表时间:2007-01-05
论坛上其实有不少类似的贴子,都是讲String类的,比如说:http://www.iteye.com/post/190112
|
|
返回顶楼 | |
发表时间:2007-01-05
to 刑天战士:当时看《深入java虚拟机》有所感触写的,搬家的时候把它贴过来了。刚刚过来,首次发帖,还不是清楚怎么运作,以后一定多多学习
to ahuaxuan: 谢谢提醒 |
|
返回顶楼 | |
发表时间:2007-01-05
看到楼主写的java String这一方面的内容,突然想到了以前看的一本书
也是写基础方面的,里面的内容个人感觉也不错: <<java面向对象程序设计教程>>李发致写的,里面的第四章和第五章个人感觉说得比较好..... |
|
返回顶楼 | |
发表时间:2007-01-06
写得确实不错!
String在内存的长度也受它内部维护的 char[] 数组的最大元素个数影响, Java的数组下标只能是有符号的int, 所以理论的最大个数应该是 2^31 另外我见过很多人把Java String跟Java 传值 还是 传址 调用混淆起来考人, 有C++基础的初学者基本都会被搞蒙, 而实际上跟传值还是传址完全两码事. 如果能结合到这篇文章里一起写写的话, 真是一篇很好的精华文章. 考人的代码比如: void func(String s) { s += "tail"; } void test() { String a = "abc"; func(a); System.out.println(a); // 问这里输出什么 } |
|
返回顶楼 | |
发表时间:2007-01-06
受教了,不错!
|
|
返回顶楼 | |
发表时间:2007-01-06
引用 我们可以使用串接操作符得到一个长度更长的字符串,那么,String对象最多能容纳多少字符呢?查看String的源代码我们可以得知类String中是使用域 count 来记录对象字符的数量,而count 的类型为 int,因此,我们可以推测最长的长度为 2^32,也就是4G。
不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示 65536个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。 两种定义方式下,string的最大长度还不一致哦? |
|
返回顶楼 | |
发表时间:2007-01-06
引用 两种定义方式下,string的最大长度还不一致哦?
String的最大长度不存在不一致问题,理论上它最多能表示2^32个字符。只要是在源文件上定义,由于class文件规范的原因,长度都只能是65534。 |
|
返回顶楼 | |