如果我做实例方法,在连接方面是否存在b/w 1和2的差异.我的意思是在任何一种情况下,最终只会构造一个对象,即"abc".只是我看到的区别是测试将位于permgen空间内,即使线程来自实例方法,但是一旦线程超出方法,x将被垃圾收集但是构造的对象数量的术语将是相同的.对?
// option 1
String test="a"+"b"+"c";
// option 2
StringBuffer x = new StringBuffer().append("a").append("b").append("c").toString()
Run Code Online (Sandbox Code Playgroud)
我引用链接http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html来得出这个结论.
首先请注意,您链接的文档非常陈旧.请注意它适用于Java 1.4.2.
J2SE 1.4.2处于Java Technology End of Life(EOL)过渡期.EOL过渡期从2006年12月11日开始,将于2008年10月30日完成,届时J2SE 1.4.2将达到其使用寿命终止(EOSL).
在较新版本的文档中,此语句已被删除.但是,您还应该注意另一个声明:
从JDK 5发行版开始,这个类已经补充了一个等效类,专门用于单个线程StringBuilder.StringBuilder类通常应优先于此使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步.
其次请注意,您引用的文档具有以下代码:
x = "a" + 4 + "c";
Run Code Online (Sandbox Code Playgroud)
这4不仅仅是一个错字.您的示例不同,因为编译器会将代码转换为仅使用单个字符串文字.这两行是相同的:
x = "a" + "b" + "c";
x = "abc";
Run Code Online (Sandbox Code Playgroud)
字符串文字将被实习.
但是在编译器不能只使用单个字符串文字的一般情况下,编译器会将第一个版本转换为第二个版本,但它会使用,StringBuilder因为它更有效.
首先 - 使用StringBuilder而不是StringBuffer,StringBuffer现在已弃用.
对于你的问题,现在它并不重要,编译器自动将String concacenation转换为StringBuilder.
只有两种情况可以使用它.第一个是更好的代码可读性(例如,如果您正在构建像SQL查询一样的长字符串).第二个,当你在循环中使用Strings时,编译器总是为每个遍历循环创建一个新的StringBuilder实例,所以要小心.
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |