我在这里已经有过类型的解答了
然后你问的是从回收的角度上来讲的话,显然StringBuffer对内存的消耗要小的多,如果你用到了类似于我在上面那篇文章中举的例子:
String s="Hello Baidu";
s=new String("Hello Baidu");
s=s.concat("!");
在内存中会有两个空间是没有指向的,也不会被回收,因为它们都还不是Null.只有等到代码结束的时候才会被回收.
在我们小的程序中这样的开销还可以忽略,但是大型的工程中,大量的开销会对代码运行的速度带来很大的影响.
而StringBuffer因为它支持修改字符串的值,所以用它来作为应用是安全的
如果我的回答还是没有关系到你想问的地方,你可以给我留言,一起探讨 =)
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
2.String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符创变量
StringBuilder:字符创变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1
String s = "sss"; 不可变是说对象new String("sss")是不可变的,你写s="ddd",创建了一个新的new String("ddd")对象,并让引用s 指向这个对象的地址,原来的sss被就被抛弃了。
String s = "sss";
s+= "ddd";
这样也是可以的,是不是s也是可变的呢?
实际上JVM是生成了一个临时对象BufferString,将两个字符串拼接后再保存为新对象,然后将引用s指向新对象。
在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的sss了,这个引用的名称没变,但它指向了新的String对象。
StringBuffer可以追加而String不能
StringBuffer是String的增强版
string str = “abc”;
str = str+"bcd"; 这样会创建一个新实例str,而不是之前的str了,会导致新对象的生成,少量的追加差别不大,如果数量多的话,StringBuffer(难道不是StringBuilder,Java还是.net)是在同一个实例的基础之上追加,速度快。
StringBuilder strb = new StringBuilder();
strb.append() //追加到当前实例上,不会创建新对象
说明:创建新对象属于程序开销较大的操作之一。