黑马程序员技术交流社区

标题: StringBuffer和StringBuilder以及String的区别 [打印本页]

作者: 赵京    时间: 2014-5-7 00:09
标题: StringBuffer和StringBuilder以及String的区别
请问StringBuffer和StringBuilder以及String的区别是什么,回答详细一些
作者: GGdog    时间: 2014-5-7 08:44
String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。
因而在大部分情况下字符串的拼接速度为:StringBuilder>StringBuffer>String
解释如下:
因为String是不可变的(通过ide的debugger可以发现其属性大都为final类型),因此每次对其操作改变其变量值,其实是生成一个新的对象,然后将变量引用指向新对象;因此速度慢。

StringBuffer则不同,对其操作即直接操作对象指向的引用,无需产生新对象,速度很快;它是线程安全的,在维护多线程的同步等也会消耗一点性能。

StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
作者: 菠萝包丶    时间: 2014-5-7 09:21
你可以去看看这个帖子,我的解答
http://bbs.itheima.com/forum.php ... mp;page=1#pid716799
作者: ningtl    时间: 2014-5-7 09:58
谢谢,学习了
作者: stamSuper    时间: 2014-5-7 10:14
第一从值方面考虑:String 是一个常量值,你可以看他的源码,他的类用了final修饰的,这就决定了这个对象是不会变化;StringBuilder和StringBuffer都是变化的,他们拼接字符串的效率要比String快。
第二从线程安全方面考虑:String 就不说了,他是不会改变的,StringBuffer是线程安全的,StringBuilder是线程非安全的。
第三从性能方面考虑: 因为StringBuffer是线程安全的,没有改变值的时候会判断锁,比较消耗资源,所以他的性能相对比StringBuilder要低 : 性能结论: StringBuilder>StringBuffer>String。所以,如果是在单线程中使用,就用StringBuilder。多线程就用StringBuffer
第四从拼接字符串方面考虑: String 一旦创建就没法改变,而另外两个功能比较类似,都可以任意插入、拼接、删除 字符串内容




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