黑马程序员技术交流社区

标题: StirngBuffer和StringBuilder的使用问题 [打印本页]

作者: Dark_Horse    时间: 2014-5-23 09:55
标题: StirngBuffer和StringBuilder的使用问题
本帖最后由 Dark_Horse 于 2014-5-24 10:10 编辑

什么时候使用StringBuffer,什么时候使用StringBuilder啊,看似都有相同方法啊......
作者: 茂子    时间: 2014-5-23 16:24
大概可以这样区分:涉及多线程的时候建议使用StringBuffer,因为它同步,安全;
StringBuilder是不同步的,所以进行单线程开发时存在安全问题。但是由于如此,就少了里边有个锁的判断环节,所以提高了程序的效率。具体该用哪个,可以根据以上区别进行判断。

但是呢,还是建议你看看Java基础教学视频,毕老师讲的关于String那章。毕竟这是我刚刚总结出来的,可能会存在中间有漏掉的环节。。
作者: hamiguadjs    时间: 2014-5-24 01:10
楼山的同学说的很对,StringBuffer和StringBuilder两者在创建对象,调用成员方法上都是一致的,不同的是它们的效率和安全问题:Stringbuffer不保证同步,其实例用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。其区别的重点是效率,而StringBuilder效率更高,高效,但不安全,StringBuffer与其相反。
作者: AntThinking_toT    时间: 2014-5-24 13:49
LZ说的问题实际是String、StringBuffer、StringBuilder三者的区别问题。
    String是JDK1.0就有的类;StringBuffer也是JDK1.0;StringBuilder则是JDK1.5才有的。相信楼主已经知道String与StringBuffer的区别,一个是长度不可变的,一个是长度可变的。现在的问题是StringBuilder也是长度可变的,与StringBuffer区别是什么?StringBuffer是线程安全的,所谓线程安全就是多个线程(涉及多线程)访问同一个变量,会不会出现数据不同步的情况,比如一个线程准备读数据,而另一个线程却正在对此数据进行修改,导致第一个数据出现“脏读”,此时就会出现麻烦,这时就需要通过同步信号量(操作系统中进程同步)进行控制,不过在Java中同步方法由synchronized修饰,保证了多个线程只能由一个线程对数据进行操作,其他线程处于等待状态,实现数据同步。当然这是需要额外的空间和进程进行保证的,所以导致StringBuffer会比较慢。StringBuilder则是线程不安全的,当单线程操作时,不会出现任何问题;但是当多个线程同时访问时,就会出现“脏读”问题,它的优点就是快,因为少了相应的信号量的处理。
     以上为原理部分,StringBuffer和StringBuilder方法确实一样,想知道到底使用哪个,就看您的使用环境如果是涉及到多线程访问,毫无疑问使用StringBuffer,可保证数据同步;如果是单线程访问,优先用StringBuilder速度快。
     LZ可以查看String/StringBuffer/StringBuildr源码http://www.cnblogs.com/jobscn/archive/2011/11/13/2246438.html




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