黑马程序员技术交流社区

标题: String问题 [打印本页]

作者: 唐溪永    时间: 2012-2-20 10:08
标题: String问题
String  和  StringBuffer的区别,希望详细说一下
作者: 邱纲    时间: 2012-2-20 10:10
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffer来动态构造字符数据。而且还有一个StringBuilder,它也是可变的字符串。与StringBuffer有相同之处,也有不同之处。
作者: 杜明辉    时间: 2012-2-20 11:51
在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 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
作者: 何招俊    时间: 2012-2-20 11:57
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对象。
作者: 靖美专    时间: 2012-2-20 12:59
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,它是县线程安全的;
作者: 陈伟    时间: 2012-2-20 13:49
String 操作后都是产生一个新的字符串对象,而stringBuffer操作的始终是原对象,
当字符串长度大时,并且多字要进行字符串连接时,使用 StringBuffer 性能要高许多。 而且 StringBuffer 是线程同步的。
作者: 【专】【属】    时间: 2012-2-20 14:35
String是不可变的。
StringBuffer类提供的字符串进行修改,但是对于1.5后,应该推荐使用StringBuilder,速度快,线程是异步.

作者: 王康    时间: 2012-2-20 14:35
在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





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