一.
1、三者执行速度方面的 比较:StringBuilder > StringBuffer > String.
2、String 字符串常量
StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)
这里要解释一下为什么String是字符串常量:
我们明明改变了String型的变量s,为什么说是没有改变呢? 其实这是一种假的改变,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行赋值代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。 一个特殊的例子: 在这一段代码中,生成str对象的速度非常快,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:String str = “This is only a” + “ simple” + “test”; 其实就是: String str = “This is only a simple test”; 所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如: String str2 = “This is only a”; String str3 = “ simple”; String str4 = “ test”; String str1 = str2 +str3 + str4; 这时候JVM会规规矩矩的按照原来的方式去做。 |
二.
1.使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
2.使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
3.使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
ps:参考博客:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html