快速业务通道

深入了解Java的String对象 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
t; a.i ="+i+"\n"; } }

深入了解Java的String对象(4)

时间:2011-10-13

三,字符串转换的优化

按照上述说法,str = 1+2+str+3+4;语句似乎应该就应该生成5个String对象:

1+2 =3,then 3→Integer(3)→"3" in pool? [假设如此] "3"+str(in heap) = "3jf" (in heap) "3jf" +3 ,first 3→Integer(3)→"3" in pool? [则不创建] then "3jf3" "3jf3"+4 create "4" in pool then "3jf34"

这里我并不清楚3,4转换成字符串后是否在池中,所以上述结果仍然是猜测.

为了减少创建中间过渡性的字符串对象,提高反复进行串接运算时的性能,a Java compiler可以使用StringBuffer或者类似的技术,或者把转换与串接合并成一步.例如:对于 a + b + c ,Java编译器就可以将它视为[as if]

new StringBuffer().append(a).append(b).append(c).toString();

注意,对于基本类型和引用类型,在append(a)过程中仍然要先将参数转换,从这个观点看,str = 1+2+str+3+4;创建的字符串可能是"3","4"和"3jf34"[以及一个StringBuffer对象].

现在我仍然不知道怎么回答str = 1+2+str+3+4;创建了多少String的对象,.或许,这个问题不需要过于研究,至少SCJP不会考它.

3,这又不同:str = "3"+"jf"+"3"+"4";

如果是一个完全由字符串文字组成的表达式,则在编译时,已经被优化而不会在运行时创建中间字符串.测试代码如下:

String str1 ="3jf34"; String str2 ="3"+"jf"+"3"+"4"; if(str1 == str2) { System.out.println("str1 == str2"); } else { System.out.println("think again"); } if(str2.equals(str1)) System.out.println("yet str2.equals(str1)");

可见,str1与str2指向同一个对象,这个对象在pool中.所有遵循Java Language Spec的编译器都必须在编译时对constant expressions 进行简化.JLS规定:Strings computed by constant expressions (y15.28) are computed at compile time and then treated as if they were literals.

对于String str2 ="3"+"jf"+"3"+"4";我们说仅仅创建一个对象.注意,"创建多少对象"的讨论是说运行时创建多少对象.

BTW:编译时优化

String x = "aaa " + "bbb "; if (false) { x = x + "ccc "; } x += "ddd ";

等价于: String x = "aaa bbb "; x = x + "ddd ";

//这个地方我自己进行了编译,不过和他的结论不一样,好像当用x+="ddd"的时候和直接的x="aaa"+"bbb"+"ddd" 不同,但是具体为什么我也不清楚,正在研究中...

4,不变类

String对象是不可改变的(immutable).有人对str = 1+2+str+3+4;语句提出疑问,怎么str的内容可以改变?其实仍然是因为不清楚:引用变量与对象的区别.str仅仅是引用变量,它的值??它持有的引用可以改变.你不停地创建新对象,我就不断地改变指向.[参考TIJ的Read-only classes.]

不变类的关键是,对于对象的所有操作都不可能改变原来的对象[只要需要,就返回一个改变了的新对象].这就保证了对象不可改变.为什么要将一个类设计成不变类?有一个OOD设计的原则:Law of Demeter.其广义解读是:使用不变类.只要有可能,类应当设计为不变类.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号