关于String、StringBuffer和StringBuilder之间的区别?

wmyong863 2010-04-28 11:49:32
说说String与StringBuffe、StringBuilder之间的区别?
...全文
1060 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Giberson1 2012-10-23
  • 打赏
  • 举报
回复
自己看API来的实际。
墙角在唱歌 2012-10-23
  • 打赏
  • 举报
回复
谁有这方面的题
墙角在唱歌 2012-10-23
  • 打赏
  • 举报
回复
请求贡献这方面的练习题 题库
墙角在唱歌 2012-10-23
  • 打赏
  • 举报
回复
各位 这么直白的说 不好理解 倒不如做这方面的题 做的越多越好 然后在参考大家的意见 会更加直观的理解,我想请求楼上的回答问题的各位 给推荐联系string、stringBuffer、stringbuilder的题库
  • 打赏
  • 举报
回复
我曾经做过测试分别在String和StringBuffer追加字符串"12345678901234567890"一百次,
String越追加越慢,完成需要大概1分钟,StringBuffer仅需1秒。
因为String每次追加需要创建对象。
lxdaicdd 2012-10-20
  • 打赏
  • 举报
回复
String 提供了数值不可变的字符串
StringBuffer 提供了数值可变的字符串,且线程安全
StringBuilder 提供了数值可变的字符串,但线程不安全
依琳小师妹 2012-10-20
  • 打赏
  • 举报
回复
这个问题太经典了!
简单来说,String长度不可变,StringBuffer和StringBuilder都是长度可变的。
同时,StringBuffer是线程安全的,而StringBuilder是非线程安全的,
所以,StringBuilder的效率要比StringBuffer高。但是String的效率是最低的,
我做过实验,StringBuilder和StringBuffer的效率比String高100多倍,所以
区别很显然,如果想详细了解它们的运行机制,介意楼主去看源码吧。
楼主难道是最近面试被问到了吗?
胸口碎大石_ 2012-10-20
  • 打赏
  • 举报
回复
相同之处:

都是基于char[]数组实现

不同之处:
String 在常量池中或堆中
StringBuffer 是线程安全,append 方法被定义为synchronized 效率较低
    /**
* Appends the specified <tt>StringBuffer</tt> to this sequence.
* <p>
* The characters of the <tt>StringBuffer</tt> argument are appended,
* in order, to the contents of this <tt>StringBuffer</tt>, increasing the
* length of this <tt>StringBuffer</tt> by the length of the argument.
* If <tt>sb</tt> is <tt>null</tt>, then the four characters
* <tt>"null"</tt> are appended to this <tt>StringBuffer</tt>.
* <p>
* Let <i>n</i> be the length of the old character sequence, the one
* contained in the <tt>StringBuffer</tt> just prior to execution of the
* <tt>append</tt> method. Then the character at index <i>k</i> in
* the new character sequence is equal to the character at index <i>k</i>
* in the old character sequence, if <i>k</i> is less than <i>n</i>;
* otherwise, it is equal to the character at index <i>k-n</i> in the
* argument <code>sb</code>.
* <p>
* This method synchronizes on <code>this</code> (the destination)
* object but does not synchronize on the source (<code>sb</code>).
*
* @param sb the <tt>StringBuffer</tt> to append.
* @return a reference to this object.
* @since 1.4
*/
public synchronized StringBuffer append(StringBuffer sb) {
super.append(sb);
return this;

StringBuilder与StringBuffer 实现方式类似 非线程安全 效率高
    public StringBuilder append(String str) {
super.append(str);
return this;
}


StringBuffer 、StringBuilder父类都是AbstractStringBuilder
nj_dobetter 2012-10-19
  • 打赏
  • 举报
回复
StringBuilder 是 StringBuffer的另一个版本, 是新加入的类, 用于只在一个线程中访问StringBuffer的情况下, 目的是为了提高性能.
selaginella 2012-10-19
  • 打赏
  • 举报
回复
String是不可改变的字符串,在内存中是不能改变大小的,也就是不能对指定的String字符串进行更改,但是StringBuffer是可以改变字符串大小的,可进行更改字符串。。。StringBuffe类没怎么用过。
PS:你可以查看java API文档啊 上面有很详细的介绍
a15850538336 2012-10-19
  • 打赏
  • 举报
回复
不错,明白了一个问题
cyky_yoyo 2012-10-19
  • 打赏
  • 举报
回复
不禁想问,这个问题直接可以搜一下,答案很多的。
neneWIN 2012-10-19
  • 打赏
  • 举报
回复
String:

是对象不是原始类型.

为不可变对象,一旦被创建,就不能修改它的值.

对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.

String 是final类,即不能被继承.

StringBuffer:

是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象

它只能通过构造函数来建立,

StringBuffer sb = new StringBuffer();

note:不能通过付值符号对他进行付值.

sb = "welcome to here!";//error

对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer

中付值的时候可以通过它的append方法.

sb.append("hello");

StringBuilder:

是一个可变对象和StringBuffer相比,不是线程安全的,一般用在单个线程操作的时候(这种情况很普遍,所

以一般优先选用StringBuilder),速度比StringBuffe快很多。

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");

str += "here";

的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后

再将StringBuffer toSting();

这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.

这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
raistlic 2012-10-19
  • 打赏
  • 举报
回复

最普遍的误区之一:

“StringBuffer/Vector/Hashtable 是线程安全的”

“线程安全”是很复杂的事情,没有“通用”的解决方案,需要“因地制宜”,不要真的以为用了上述的类就真的“线程安全”了。

事实是,StringBuffer/Vector/Hashtable 由于设计缺陷,几乎没什么用,事实上早就被废弃了。
zhangqiaoqiao123 2012-10-18
  • 打赏
  • 举报
回复
String 不可变字符序列
StringBuffer 线程安全的可变字符序列
StringBuilder 非线程安全的可变字符序列
书断华 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
String是一个商品
StringBuffer/StringBuilder是生产这个商品的流水线,
StringBuffer速度慢,但(线程)安全性高
StringBuilder速度快,但(线程)安全性差
[/Quote]

学习了 比喻的很好!
q6823221 2012-07-20
  • 打赏
  • 举报
回复
String是不能变的字符串,而StringBuffer和StringBuilder都是可变的。StringBuilder效率比StringBuffer高,但是StringBuffer是线性安全的,而StringBuilder是不安全的
g28yang 2012-07-20
  • 打赏
  • 举报
回复
stringbuilder比stringbuffer更有效率一些,java SE在不断更新,。stringbuffer都是老版本了。推荐用stringbuilder吧
ylwltc 2012-07-20
  • 打赏
  • 举报
回复
StringBuilder和StringBuffer是可变长的,经常用于追加。修改。删除 字符串。。。。
chenshuang_com 2012-07-17
  • 打赏
  • 举报
回复
因为String是不可改变的,所以引入了StringBuilder和StringBuffer,StringBuffer是线程安全的,StringBuilder是线程非安全的效率比StringBuffer高
加载更多回复(8)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧