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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐溪永 黑马帝   /  2012-2-20 10:08  /  2974 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String  和  StringBuffer的区别,希望详细说一下

7 个回复

倒序浏览
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffer来动态构造字符数据。而且还有一个StringBuilder,它也是可变的字符串。与StringBuffer有相同之处,也有不同之处。
回复 使用道具 举报
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");  str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();

这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
回复 使用道具 举报
String s = "sss"; 不可变是说对象new String("sss")是不可变的,你写s="ddd",创建了一个新的new String("ddd")对象,并让引用s 指向这个对象的地址,原来的sss被就被抛弃了。

String s = "sss";
s+= "ddd";
这样也是可以的,是不是s也是可变的呢?
实际上JVM是生成了一个临时对象BufferString,将两个字符串拼接后再保存为新对象,然后将引用s指向新对象。

在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的sss了,这个引用的名称没变,但它指向了新的String对象。
回复 使用道具 举报
String,是字符串常量,StringBuffer是字符串变量(线程安全);
简单的讲它们的区别在于,String是不可变对象,因此每次对Strng类型进行改变的时候,其实等于生成了一个新的String对象,然后将指针只指向的新的String对象,....因为每次声称对象都会对系统性能产生影响,对于新生成的对象,都放在Eden中;当Eden充满时(小孩太多了),VC的GC就会开始工作,那速度一定会相当慢的.
    但如果使用了StringBuffer,结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用.所以一般情况下推荐使用StringBuffer,特别是字符串对象经常改变的情况下.    而在某些情况下,String对象的字符串拼接的其实是被JVM解释成StringBuffer对象的拼接,所以有些时候S听对象的速度并不会比StringBuffer对象慢,而特别是一下的字符串对象生成中,String效率是远比StringBuffer快的:
  String str = "This is only a" + "simple" + "test";
StringBuffer  str1= new StringBufer("This is only a").append("simple" ).append("test");
我们会惊讶的发现生成str对象的速度实在太快了,这时候StringBuffer居然速度不占优势,其实这是JVM的一个把戏,
  实际上String str= "This is only a" + "simple" + "test";  就是String str= "This is only a simple test";所以不需要太多时间了.
   但是,如果字符串来自另外的String对象的话,速度也没那么快;例如;
  String str2 = "This is only a";
String str3 = "simple";
String st4= "test";
String st1= "str2+str3+str4;
这时候JVM会规规矩矩按照原来的方式去做.
总而言之: 如果偶尔对字符串常量进行拼接,可以使用String,它足够简单轻量级; 如果经常对字符串进行拼接,累加操作请用StringBuffer或StringBuider;单线程环境建议用StringBuilder,因为它比Stringbuffe快r, 多线程环境用StringBuffer,它是县线程安全的;

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
String 操作后都是产生一个新的字符串对象,而stringBuffer操作的始终是原对象,
当字符串长度大时,并且多字要进行字符串连接时,使用 StringBuffer 性能要高许多。 而且 StringBuffer 是线程同步的。

评分

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

查看全部评分

回复 使用道具 举报
String是不可变的。
StringBuffer类提供的字符串进行修改,但是对于1.5后,应该推荐使用StringBuilder,速度快,线程是异步.
回复 使用道具 举报
王康 黑马帝 2012-2-20 14:35:38
8#
在java中有3个类来负责字符的操作。

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。

3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

建议使用先后顺序:
Stringbulider > StringBuffer > String

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马