黑马程序员技术交流社区

标题: String,StringBuffer与StringBuilder的区别有哪些? [打印本页]

作者: 樊其杰    时间: 2013-1-11 12:39
标题: String,StringBuffer与StringBuilder的区别有哪些?
本帖最后由 樊其杰 于 2013-1-13 20:37 编辑

有没哪位大神用通俗易懂的方法讲一下?
作者: 汪叶庭    时间: 2013-1-11 13:01
1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

2.String <(StringBuffer,StringBuilder)的原因

    String:字符串常量

    StringBuffer:字符创变量

    StringBuilder:字符创变量
3对于三者使用的总结:
1).如果要操作少量的数据用 = String

2).单线程操作字符串缓冲区下操作大量数据 = StringBuilder

3).多线程操作字符串缓冲区下操作大量数据 = StringBuffer[table=px]

作者: 黄锦成    时间: 2013-1-11 13:09
String 是不可变的,StringBuilder和StringBuffer是用来动态构建字符串的。单线程时建议使用StringBuilder。
作者: jonn    时间: 2013-1-11 13:57
  1. public class Con {
  2.   public static void main(String[] args){
  3.     String msg="msg";
  4.     String s="abc"+msg+"def";
  5.     System.out.println(s);
  6. }
  7. }


复制代码
此代码工作原理如下: JDK自带的工具javap反编译以上代码 javap -c Con 生成结果如下截图



若你懂汇编,此代码肯定熟悉,编译器自动引入了StringBuilder类,虽然源代码并没有使用StringBuilder类,每个字符串调用一次StringBuilder,共调用了3次,编译效率提高了
若多次修改同一个String对象引用,就是 产生没必要了垃圾堆,分析如下


修改次数多,产生垃圾堆就多,影响执行效率,想象一下for循环万次,内存中的对象没有被GC清理,占多大的内存,很惊人的数字
StringBuffer 线程同步,一搬都是多线程中修改某数据缓冲区的内容,通过每个线程实行了方法调用的顺序一致来实现
它本身就是对自身对象操作,不会生产新的对象,可以改变对象引用
StringBuilder 线程非同步 ,单独线程使用
LZ也可测试这三个性能上的差别 StringBuilder >StringBuffer>String






QQ截图20130111132846.png (38.04 KB, 下载次数: 41)

截图

截图

作者: 罗利华    时间: 2013-1-11 17:05
本帖最后由 修心者 于 2013-1-11 17:06 编辑

个人理解:
首先这三个类都是对字符串进行操作的
1,String:由这个类产生的对象,都是独立的,也就是说,
当你对一个原有对象修改后,会产生一个新的对象,原来的仍然存在。如下代码:
String a = "abc";
a+="d";
对于原来的对象进行修改后,它仍然存在,只是不再使用它,
这时会产生一个新的对象,也存在内存中。
2,StringBuffer:线程安全(JVM利用某些机制使访问有序执行),这个类解决了String中存在的缺陷,
拿上面的代码来说,它是在原有的对象上进行的修改,所以在内存还是一个对象,
3,StringBuileer:非线程安全(对象同时被多个线程时,不能保证一致性),其它的都和StringBuffer差不多。
在日常的操作中,一般用StringBuileer是最合适的,因为它最快,当然,前提是单线程操作。
如果是多线程操作,使用StringBuffer,它是线程安全的嘛。
对于String,效率低,占空间。
好吧,就这些。
作者: 洪建超    时间: 2013-1-12 13:51
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的
作者: HM李超    时间: 2013-1-13 20:15
String是简单的字符串常量;
StringBuffer是线程安全的;
StringBuilder是不安全的;

(1)String是不可变对象,就是说当我们创建一个String对象str1 = "abc",此时开辟了一个空间存放着abc,str1指向它,现在我给str1“重新赋值”str1=“def”,此时其实是重新开辟了一个空间存放def,str1指向新空间。而StringBuffer则是这样,它会直接修改开始那个空间里的值,所以,String是改变的地址,而StringBuffer则是修改值。
(2)在判等时,string 对象重写了object对象的equals()方法,比较的是值而非地址,而StringBuffer没有重写这个方法,判别的是地址。
(3)在连接字符串时,通常选用stringbuffer,因为效率更高一些,比如string a = new String("hello"); a += "world";其实在连接的时候,是将a转化为一个stringbuffer对象,然后利用stringbuffer的append方法,连接world,最后再转化为string对象。
三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2