深入了解Java的String对象 - 编程入门网
t; a.i ="+i+"\n"; }
}
深入了解Java的String对象(4)时间:2011-10-13三,字符串转换的优化 按照上述说法,str = 1+2+str+3+4;语句似乎应该就应该生成5个String对象:
这里我并不清楚3,4转换成字符串后是否在池中,所以上述结果仍然是猜测. 为了减少创建中间过渡性的字符串对象,提高反复进行串接运算时的性能,a Java compiler可以使用StringBuffer或者类似的技术,或者把转换与串接合并成一步.例如:对于 a + b + c ,Java编译器就可以将它视为[as if]
注意,对于基本类型和引用类型,在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"; 如果是一个完全由字符串文字组成的表达式,则在编译时,已经被优化而不会在运行时创建中间字符串.测试代码如下:
可见,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 "; 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |