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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String ,StringBuffer 和StringBuilder之间具体的区别是什么

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

11 个回复

倒序浏览
StringBuffer 和StringBuilder之间具体的区别是:
两个都是容器,可以用来存储数据,
StringBuffer是线程同步的,StringBuilder是线程不同步的。
一般在单线程中我们都是用StringBuilder,因为这个容器的效率比较高!
在多线程中我们就是用StringBuffer,这个是线程安全的!
两者的方法基本相同!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
一般的情况下执行速度:StringBuilder >  StringBuffer  >  String
String 类代表字符串,字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串
StringBuilder:线程非安全的
StringBuffer:线程安全的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主你好:

JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。
该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
方法和StringBuffer一样;

StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全。
StringBuilder线程不安全。

单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。

String是静态数组类,一旦确定就无法加长
StringBuffer是动态数组类,大小可以变
StringBUffer的很多方法是与String不同的,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
StringBuffer与StringBuilder的区别主要是前者是线程安全的,就是说它是同步的;后者不安全,不是同步的,其它的区别不大。当你的程序不需要线程同步,一般都用StringBuilder.

StringBuilder(以下简称sb)与String(以下简称str)的区别是:
举个例子吧:String s = new String(“woshizifuchuan”);
当你要改变s的时候,比如改为s =s+”dsdsdsd”;
系统会重新创建一个字符串变量它的值为”woshizifuchuandsdsdsd”,然后把该字符串赋值给s.
当你这样的改变s的行为在一个循环里面,那么将会创建大量的中间变量,影响程序的运行效率:
如:for(int i=0;i<100000;i++){
s=”a”;
}
StringBuilder sb = new StringBuilder();一次性给sb分配一个固定长度大小的内存空间,当你改变的时候会在此空间后面加上,不够的时候,内存空间自动增加.
比如初始分配的内存大小为10字节,
那么.Sb.append(“as”);
它占据内存空间10字节,此时sb.toString().equals(“as”)为true;Sb.append.(“qqq”),
它占据的内存空间还是10字节,sb.toString().equals(“asqqq”)为true.
当内存空间不够的时候,自动加长,加入一次增加10字节,
那么:Sb.append(“ppppppp”),它占据的内存空间为20字节.
StringBuilder允许设定它的初始长度和每次增加的长度。

综合来说:当你大量更一个字符串的时候,String消耗的内存空间小,但是执行效率低.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
StringBuffer是线程同步, StringBuilder是线程不同步。
StringBuilder用在字符串缓冲区被单个线程使用的时候,StringBuffer可将字符串缓冲区安全地用于多个线程,并且不能修改。
从 JDK 5 开始,为 StringBuffer 类补充了一个单个线程使用的等价类,即 StringBuilder。并且通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
吴波 中级黑马 2013-4-29 11:54:58
7#
String
        字符串最大的特点:一旦被初始化就不可以被改变
        String类复写了object类中的equals方法,该方法用于判断字符串是否相同。

        String类适用于描述字符串事物,那么它就提供了多个方法对字符串进行操作

StringBuffer
        StringBuffer是字符串缓冲区,是一个容器,
        特点:
            而且长度是可变化的
            可以直接操作多个数据类型
            最终会通过toString 方法变成字符串

StringBuilder
        1.5版本之后出现的,用于替换StringBuffer,提高效率,以后开发,建议使用StringBuilder

        StringBuffer是线程同步,多线程的情况一般用StringBuffer,也可以不用它
        StringBuilder是线程不同步,单线程的情况一般用StringBuilder

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
/*
*  String类、StringBuilder类、StringBuffer类的区别
*  
*        String类的特点:是常量,不可改变的。
*        StringBuilder和StringBuffer类的特点:是可变的子符序列,其对象内容是可以改变的。
*
*        StringBuffer类: 同步的, 线程安全, 但效率略低(jdk1.0开始使用)
*        StringBuilder类: 不同步, 效率高. 单线程的程序使用这个类更好. (jdk1.5开始使用)
*/
public class Demo13 {
        public static void main(String[] args) {
                String s = new String("java");
                s.toUpperCase();                                                           //把String转为大写
                System.out.println(s);                                                        //打印出的是java小写的,证明,s一直没有变,s个常量
               
                StringBuilder sb = new StringBuilder("java");
                sb.append("黑马程序员");
                System.out.println(sb);                         //打印的结果是java黑马程序序,sb变了,证明是其是可变的对象内容
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
$love 发表于 2013-4-29 11:39
StringBuffer 和StringBuilder之间具体的区别是:
两个都是容器,可以用来存储数据,
StringBuffer是线程同 ...

谢谢你回答的问题  我还想了解 String、StringBuffer、StringBuilder在内存中是怎样存在的?
回复 使用道具 举报
袁梦希 发表于 2013-4-29 11:47
楼主你好:

JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。

谢谢你的回答  我还想了解一下StringBuffer和StringBuilder都是可变字符串对吧? 当追加字符串时存不存在效率问题呢?
回复 使用道具 举报
$love 中级黑马 2013-4-29 21:23:56
11#
不用客气!互相学习!
都可以通过append()方法追加!这个效率要比String用+号叠加高
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马