String和StringBuffer有什么区别?

2024-12-28 08:26:57
推荐回答(5个)
回答1:

我在这里已经有过类型的解答了

然后你问的是从回收的角度上来讲的话,显然StringBuffer对内存的消耗要小的多,如果你用到了类似于我在上面那篇文章中举的例子:
String s="Hello Baidu";
s=new String("Hello Baidu");
s=s.concat("!");
在内存中会有两个空间是没有指向的,也不会被回收,因为它们都还不是Null.只有等到代码结束的时候才会被回收.
在我们小的程序中这样的开销还可以忽略,但是大型的工程中,大量的开销会对代码运行的速度带来很大的影响.

而StringBuffer因为它支持修改字符串的值,所以用它来作为应用是安全的

如果我的回答还是没有关系到你想问的地方,你可以给我留言,一起探讨 =)

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

回答2:

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

回答3:

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对象。

回答4:

StringBuffer可以追加而String不能
StringBuffer是String的增强版

回答5:

string str = “abc”;
str = str+"bcd"; 这样会创建一个新实例str,而不是之前的str了,会导致新对象的生成,少量的追加差别不大,如果数量多的话,StringBuffer(难道不是StringBuilder,Java还是.net)是在同一个实例的基础之上追加,速度快。
StringBuilder strb = new StringBuilder();
strb.append() //追加到当前实例上,不会创建新对象

说明:创建新对象属于程序开销较大的操作之一。