黑马程序员技术交流社区

标题: 关于StringBuffer和StringBuilder?? [打印本页]

作者: 金兴    时间: 2012-4-8 22:36
标题: 关于StringBuffer和StringBuilder??
StringBuffer与StringBuilder他们俩有什么区别,他们俩哪个线程安全?哪个运行效率比较高啊???
作者: 秦岩    时间: 2012-4-8 22:37
1. String 类
     String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
   String a = "a"; //假设a指向地址0x0001
   a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
   因此String的操作都是改变赋值地址而不是改变值操作。
2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
   StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
   StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
   StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
3.StringBuffer
  StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
4.线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
5.速度
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
6.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
作者: 高铭    时间: 2012-4-8 22:40
StringBuffer 和 StringBuilder的区别就是

SringBuffer是线程同步
StringBuilder是线程不同步  开发的时候用StringBuilder
线程不同步可以添加锁Lock

StringBuilder比SringBuffer效率高,,也简化了书写,更具有安全性
用StringBuilder比较好
作者: 薛飞飞    时间: 2012-4-8 22:41
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
作者: 邓海涛    时间: 2012-4-8 22:43
当然是StringBuffer的效率高啊,
String的内容一旦声明则不可改变,如果要改变,则改变的肯定是String的引用地址,那么如果现在的情况是一个字符串要被经常改变的此时就必须使用StringBuffer类。
作者: 胡元    时间: 2012-4-8 22:43
StringBuilder是StringBuffer的升级版本,区别就是Stringbuilder效率高
但是线程不同步,不安全,StringBuffer效率低,但是线程同步,安全!引用楼上的总结
.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
作者: newlaw2013    时间: 2012-4-8 22:45
StringBuilder和StringBuffer都用于字符串的拼接。
StringBuilder:new了一个缓冲区后,不考虑线程安全(因此是线程不安全的,不用于多线程),因此填充数据速度快。
StringBuffer:线程安全,可用于多线程,但是效率就没有StringBuilder高了
作者: 曾晓文    时间: 2012-4-8 22:49
本帖最后由 曾晓文 于 2012-4-8 22:52 编辑

StringBuffer是线程安全的。StringBuffer类内部用了线程同步,同一时刻只允许一个进程去访问StringBuffer缓冲区的数据。所以它是线程安全的,但是它的效率比StringBuffer慢。
StringBuilder不是线程安全的,每个线程都可同时访问StringBuilder缓冲区的数据,这样会出现数据安全问题。
所以:一般多线程用StringBuffer(保证数据安全),单线程用StringBuilder(没有数据安全问题,这样效率更高)。
作者: 未长法    时间: 2012-4-8 22:56
StringBuffer是线程同步。
StringBuilder是线程不同步。
StringBuilder是StringBuffer的升级版本, 因为它支持所有相同的操作,但由于它不执行同步,所以速度更快, 效率要高.
以后开发,建议使用StringBuilder,如果要用到多线程的话就要用StringBuffer.

作者: 郑涛    时间: 2012-4-8 23:12
StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
StringBuffer 与StringBuilder
从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与StringBuffer相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
作者: 金兴    时间: 2012-4-9 22:00
已经哦 了 !
作者: pray    时间: 2014-4-26 06:45
切!(虽然仅仅一个字,却生动的表达了回复人的不屑于洒脱,反映出作者性格中的冷漠和无奈,以一种打酱油的心情冷眼旁观这世界,足以反应作者被社会冷漠氛围的影响,也反应了河蟹社会人们从敢怒不敢言的心情逐渐转变成不愿言,不想言知道无话可言的一种悲哀,深深的反映出现在网络审查之严厉,跨省之可怕,最后以感叹号结尾,点睛之笔,将文章升华为一切归于不言中,一切又有谁敢言的境界,用最精炼且安全的文字,表达了大家内心深处的抗争)




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