网上关于此两者的讨论太多了,但今天看了O'Reilly的Better Faster Lighter Java时,有些别的看法,例如:
String middle = "very, ";String prefix "This code is ";String suffix = "ugly."String result = "";StringBuffer buffer = new StringBuffer( );buffer.append(prefix);for (int i= 0; i<5; i++) { buffer.append(middle);}buffer.append(suffix);result = buffer.toString( );
or this one:String result = "This code is ";for (int i= 0; i<5; i++) { result = result + "much, ";}result = result + "simpler, and neater.";
O'Reilly对此的看法是他并不觉得使用第一种编码会比第二种,实际上,以前旧版本的jvm是不会对string的拼接操作进行优化的,使得每次在进行拼接string时会再生成一个新的对象,因此,当循环数非常大时,例如10000个,你可以在内存中看到10000多个对象(没有回收的前提下),因此对于上千个并发来说,这个是相当恐怖的,但现在的JVM已经相当优化了,它会对string进行解释,因此,他认为上面两种在大批次循环是没有什么区别的,到最后,你同样要maintain a bigger blob of uglier code until the end of time,其实,如果在JVM有进行优化的前提下,第二种是在牺牲了一小部分性能的前提下达到了维护的方便性的,和代码的可读性的,因此个人也同意O'Reilly的看法,呵呵,欢迎大家继续讨论.
String middle = "very, ";String prefix "This code is ";String suffix = "ugly."String result = "";StringBuffer buffer = new StringBuffer( );buffer.append(prefix);for (int i= 0; i<5; i++) { buffer.append(middle);}buffer.append(suffix);result = buffer.toString( );
or this one:String result = "This code is ";for (int i= 0; i<5; i++) { result = result + "much, ";}result = result + "simpler, and neater.";
O'Reilly对此的看法是他并不觉得使用第一种编码会比第二种,实际上,以前旧版本的jvm是不会对string的拼接操作进行优化的,使得每次在进行拼接string时会再生成一个新的对象,因此,当循环数非常大时,例如10000个,你可以在内存中看到10000多个对象(没有回收的前提下),因此对于上千个并发来说,这个是相当恐怖的,但现在的JVM已经相当优化了,它会对string进行解释,因此,他认为上面两种在大批次循环是没有什么区别的,到最后,你同样要maintain a bigger blob of uglier code until the end of time,其实,如果在JVM有进行优化的前提下,第二种是在牺牲了一小部分性能的前提下达到了维护的方便性的,和代码的可读性的,因此个人也同意O'Reilly的看法,呵呵,欢迎大家继续讨论.
String 在每次 进行字符串想加的时候都会在 内存的堆里去创建一个对象 同时 还会在String pool池里去创建一个对象
而StringBuffer 则不同,他是在原有的对象的基础上进行修改
则StringBuffer的性能肯定是高于String
StringBuffer次之
String再次之
2,StringBuilder是jdk 5.0后才有的。
所以才有了StringBuilder的诞生