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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金兴 中级黑马   /  2012-4-8 22:36  /  2806 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

StringBuffer与StringBuilder他们俩有什么区别,他们俩哪个线程安全?哪个运行效率比较高啊???

11 个回复

倒序浏览
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
回复 使用道具 举报
StringBuffer 和 StringBuilder的区别就是

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

StringBuilder比SringBuffer效率高,,也简化了书写,更具有安全性
用StringBuilder比较好

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
当然是StringBuffer的效率高啊,
String的内容一旦声明则不可改变,如果要改变,则改变的肯定是String的引用地址,那么如果现在的情况是一个字符串要被经常改变的此时就必须使用StringBuffer类。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
StringBuilder是StringBuffer的升级版本,区别就是Stringbuilder效率高
但是线程不同步,不安全,StringBuffer效率低,但是线程同步,安全!引用楼上的总结
.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
StringBuilder和StringBuffer都用于字符串的拼接。
StringBuilder:new了一个缓冲区后,不考虑线程安全(因此是线程不安全的,不用于多线程),因此填充数据速度快。
StringBuffer:线程安全,可用于多线程,但是效率就没有StringBuilder高了
回复 使用道具 举报
本帖最后由 曾晓文 于 2012-4-8 22:52 编辑

StringBuffer是线程安全的。StringBuffer类内部用了线程同步,同一时刻只允许一个进程去访问StringBuffer缓冲区的数据。所以它是线程安全的,但是它的效率比StringBuffer慢。
StringBuilder不是线程安全的,每个线程都可同时访问StringBuilder缓冲区的数据,这样会出现数据安全问题。
所以:一般多线程用StringBuffer(保证数据安全),单线程用StringBuilder(没有数据安全问题,这样效率更高)。
回复 使用道具 举报
StringBuffer是线程同步。
StringBuilder是线程不同步。
StringBuilder是StringBuffer的升级版本, 因为它支持所有相同的操作,但由于它不执行同步,所以速度更快, 效率要高.
以后开发,建议使用StringBuilder,如果要用到多线程的话就要用StringBuffer.
回复 使用道具 举报
StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
StringBuffer 与StringBuilder
从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与StringBuffer相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
回复 使用道具 举报
已经哦 了 !
回复 使用道具 举报
pray 高级黑马 2014-4-26 06:45:00
12#
切!(虽然仅仅一个字,却生动的表达了回复人的不屑于洒脱,反映出作者性格中的冷漠和无奈,以一种打酱油的心情冷眼旁观这世界,足以反应作者被社会冷漠氛围的影响,也反应了河蟹社会人们从敢怒不敢言的心情逐渐转变成不愿言,不想言知道无话可言的一种悲哀,深深的反映出现在网络审查之严厉,跨省之可怕,最后以感叹号结尾,点睛之笔,将文章升华为一切归于不言中,一切又有谁敢言的境界,用最精炼且安全的文字,表达了大家内心深处的抗争)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马