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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 万坤 中级黑马   /  2014-5-12 18:45  /  2147 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Stringbuffer 和 StringBuilder 区别

8 个回复

倒序浏览
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都是String类的对象。字符串是常量;它们的值在创建之后不能改变。所以可以共享它们。
String类,这个类没有被final关键字修饰,所以可以被继承。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享(来自API文档)。这个类有一个特性,字符串与任何类型的数据“+”相连接,那么他就变成了字符串,这个操作是通过StringBuilder或者StringBuffer类及其append方法实现的


StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。
StringBuffer类,这个类被final关键字修饰,不能够被继承。长度和内容建立后可以被修改。字符串缓冲区都有一定的容量,如果没有超过默认的容量,立即存储,如果超过默认容量,容量会自动增加。还有,她出现在JDK1.0,并且是线程同步的,所以效率略低。


StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。
StringBuilder类,这个类被final关键字修饰,不能够被继承。她提供一个与 StringBuffer 兼容的 API,StringBuilder的出现就是替代StringBuffer的。StringBuilder是出现在JDK1.5,她是线程不同步的,所以效率略高。  在开发中,优先考虑StringBuilder

值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用该类。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报


其实LZ搜一下以前的帖子就很容易找到答案。

StringBuilder和StringBuffer都是字符串缓冲区

区别在于:

StringBuffer 是线程安全的,效率低,建议开发多线程程序中使用
StringBuilder 是线程不安全的 效率高,建议开发单线程程序中使用

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单来说 String  是死的 不可改变的  StringBuffer是活的 可改变的
回复 使用道具 举报
Java中String的设定牵扯到很多问题,换句话说,String必须是不可改变的。最重要的就是安全问题,作密码时可以被改变会出问题,然后是常量池的问题,常量池的设计可以减少很多堆内存的不必要使用。如果String是可变的,常量池的设计就是有问题的。然后还有线程安全的考虑,String不可变,就是线程安全的。还有就是String根据HashCode作为标识,创建时就被缓存了,适合作Map中的键,而且字符串作为键会比其它对象快。
回复 使用道具 举报
StringBuffer 是线程安全的,效率低,建议开发多线程程序中使用
StringBuilder 是线程不安全的 效率高,建议开发单线程程序中使用
一般用StringBuilder的多
回复 使用道具 举报
彭飞 中级黑马 2014-5-12 23:30:56
7#
介个么,其实2者都是字符串缓冲区
只不过StringBuilder是1.5版本后才出的,可以说是StringBuffer的新版本
他们的区别应该就是新版本是非安全的,而旧版本是安全的。

老师推荐使用新版本的StringBuilder 虽然线程不安全,但是可以加Lock 锁自定义让其成为安全线程,
新版本既然出,必然更好。

其实我们只是看视频,接收的只是老师讲解的基础知识,
练习和应用的时候, 如果有题多练习,应该自己都能体会出那个版本更好。
回复 使用道具 举报
墨香 中级黑马 2014-5-18 21:30:28
8#
给你稍微总结下:
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

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1

查看全部评分

回复 使用道具 举报
0.0这问题好像经常问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马