A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请问String 和StringBuffer有什么区别以及 StringBuffer与StringBuilder又有什么区别,他们之间有什么关联吗?谢谢!

5 个回复

正序浏览
在毕老师的视频里讲到很清楚的
回复 使用道具 举报
1.String VS StringBuffer
    String类和StringBuffer类都是对字符进行操作的。总结: 如果在程序中需要对字符串进行频繁的修改  连接操作的话.使用StringBuffer性能会更高
    <1>String类的对象时不可变对象,一旦创建就不能修改它的值了。对于已经存在的String对象的修改      
          重新创建一个新的对象,然后把新的值保存进去。同时String是final类,无法被继承。
    <2>StringBuffer是一个可变对象,当它进行修改的时候不会像String那样重建对象他只能通过构造
          函数来建立。
  1. StringBuffer sbr = new StringBuffer();
  2. sbr = "java";//这样给StringBuffer赋值是不对的。

  3. sbr.append("java");
复制代码
//StringBuffer对象建立之后,在内存中就会分配内存空间,并初始化值为null,通过它的append()方法可以添加值进去。

字符串连接操作中StringBuffer的效率要比String高:比如代码:
  1. String str = new String("Hello");
  2. str += "java";
复制代码
此两条语句的处理步骤实际上是通过建立一个StringBuffer,然后调用append()方法,最后再将StringBuffer的对象toString()处理,这样的话String的连接就比StringBuffer多出了一些附加操作,效率上就会打折扣。
而且因为String的对象一旦在内存堆空间中建立就不可变了,每次对string的操作多会产生新的对象并保存,原来的对象值就会成为内存垃圾,无法消除。


2.StringBuffer VS StringBuilder
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而 StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用 StringBuffer和StringBuilder类。 总之,前者在线程上是安全的,而后者是不安全的,高效率就伴随着高风险。

3.String VS StringBuffer VS StringBuilder
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
<1>如果要操作少量的数据用 = String
<2>单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
<3>多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
String--声明后,内容不可变。只能重新引用。
StringBuffer--声明后内容、长度可变。

StringBuffer--同步,安全的。效率与相对StringBuffer低。
StringBuilder--异步,不安全的。但能自己加锁。效率因不是同步,所以相对对StringBuilder高一点。1.5出现的代替StringBuilder的。建议优先采用。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
其实论坛里边回答这个问题的帖子太多了。
用白话来说吧
String 类是用来给字符串常量起名字的 比如,String s = "abcd"这样这个“abcd”就有了一个名字,但是,"abcd"这个常量是不可以再改变了,而s呢只是个名字, 指向的是个地址,所以s的指向是可以改变的,比如
s = s + “b”;这样s的指向就变了,不再指向“abcd”这个字符串了,而是指向“abcdb”这个串了

而StringBuffer只是一个类似工具类的东西,相当于io流里边的缓冲,是字符串缓冲区,既然是缓冲区,长度自然可以改变,还有好多方法,貌似是提高效率的,线程安全,就是说有锁,当然每次访问的时候都要问锁,效率相对低点
而StringBuilder是后来用来代替StringBuffer的一个类,线程不安全,但是效率高。因为学过了锁的知识以后,你自己可以做到线程安全了,就不需要用StringBuffer这个线程安全的效率相对低的工具了,建议使用StringBuilder,效率高
StringBuiler和StringBuffer的功能是一样的,都有赠删改的方法。
回复 使用道具 举报
String 类代表字符串。。字符串是常量;它们的值在创建之后不能改变。
StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。
StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马