使用operator + vs使用stringbuffer进行字符串连接?

M S*_*ach 2 java string

如果我做实例方法,在连接方面是否存在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来得出这个结论.

Mar*_*ers 8

首先请注意,您链接的文档非常陈旧.请注意它适用于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因为它更有效.


Pet*_*sik 5

首先 - 使用StringBuilder而不是StringBuffer,StringBuffer现在已弃用.

对于你的问题,现在它并不重要,编译器自动将String concacenation转换为StringBuilder.

只有两种情况可以使用它.第一个是更好的代码可读性(例如,如果您正在构建像SQL查询一样的长字符串).第二个,当你在循环中使用Strings时,编译器总是为每个遍历循环创建一个新的StringBuilder实例,所以要小心.

  • +1虽然`StringBuffer`不被弃用,但它可能应该是因为几乎没有充分的理由使用它,除了需要它的遗留库.例如,它在SimpleDateFormat中使用,这是一个非线程安全的类.;) (3认同)