1.三者在执行速度方面的比较:StringBuilder>StringBuffer>String
2.String<(StringBuilder,StringBuffer)的原因
String:字符串常量
StringBuffer:字符串变量
StringBuilder:字符串变量
例如
String s="abcd";
s=s+1;
System.out.println(s);//abcd1
我们明明改变了String型的变量s,为什么说没有改变呢?
jvm是这个解析这段代码的:首先创建对象s,赋予abcd,然后在创建一个新的对象s用来 执行第二行代码,也就是说我们之前对象s并没有变化,
所有说String类型是不可改变的对象,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会被gc回收,故效率低
而StringBuffer与StringBuilder是字符串变量,是可变的对象,每当我们用他们对字符串操作时,实际上是在一个对象上操作,不像String一样创建额外的对象进行
操作,故速度快
3.一个特殊的例子
String str="this"+" is"+" only"+" a"+"simple"+"test";
StringBuilder sBuilder=new StringBuilder("this").append("is").append("only ").append("a").append("simple").append("test");
----
实际上str就相当于
String str="this is only a simple test";
但是如果字符串是来自另外的String对象的话,速度就没那么快了,例如
String str1="this";
String str2="is";
.....
String str6="test";
String str=str1+str2+...+str6;
4.StringBuffer余StringBuilder
StringBuffer:线程安全的
StringBuilder:线程非安全的
当字符串缓冲区被多个线程使用的时候,JVM不能保证StringBuilder的操作时安全的,虽然他速度最快,但可以保证StringBuffer是可以正确操作的.大多数情况下
我们是在单线程下进程操作,所有大多数情况下是建议使用StringBuilder而不用StringBuffer,就是速度的原因.
三者总结:1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区, 用StringBuilder
3.多线程操作字符串缓冲区,用StringBuffer