黑马程序员技术交流社区

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

作者: 张周飞    时间: 2014-6-10 09:14
标题: String 和StringBuffer的区别
本帖最后由 张周飞 于 2014-6-13 10:39 编辑

{:3_52:}学习遇到问题,求大神们解答一下:String 和StringBuffer的区别?
作者: 师在飞    时间: 2014-6-10 09:18
String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
作者: peku    时间: 2014-6-10 09:30
String一旦定义后其值就不能改变,而StringBuffer相当于一个装字符串的可变容器,可以对装的内容进行增删改查等操作
作者: 杨韬略    时间: 2014-6-10 09:33
本帖最后由 杨韬略 于 2014-6-10 09:37 编辑

解答:string类型变量一经创建就不能改变其内容了,而StringBuffer是可以随便更改内容的,详情如下面这个测试小程序,帮你区分一下。


public class StringBufferTest {

        /**
         * @param args
         */
        StringBuffer buffer;
        public static void main(String[] args) {
               
               String s = "abc";
               s.substring(1);
               s.replace("bc", "xyz");
               System.out.println(s); //输出结果为abc,因为字符串一经创建是不能更改的,若要修改可以使用StringBuffer

                buffer=new StringBuffer("abc");   
                buffer.append(s);
                System.out.println(buffer.substring(0));
        }

}

作者: 坠花湮    时间: 2014-6-10 09:44
其实就是“可变”和“不可变”的区别,String类型定义了一个字符串以后,其值是不可改变的,而StringBuffer可以通过append方法进行字符串追加。其次在字符串连接操作过程中,StringBuffer要比String运行效率要高
作者: 丁绍然    时间: 2014-6-10 11:33
标题: <html/>
本帖最后由 丁绍然 于 2015-9-27 09:48 编辑

<html/>                     <a href=“drop table user ”>
作者: 大鑫    时间: 2014-6-10 18:41
“String”对象是不可变对象,一旦创建就不能改变它的值,如果要修改“String”对象,是会重新创建一个新的对象,把修改的数据存入新的对象中,例如原有对象 String str = “ab”,如果str = str+“c”,会产生新的实例str,并把数据存入其中“abc”。而“StringBuffer”对象是一个可变对象,在StringBuffer”类中提供了众多可以操作StringBuffer”对象的方法,可以通过append()等方法改变对象的数据,并不会创建新的对象。

作者: wojiaojay    时间: 2014-6-10 20:54
String不可变,如果要把多个字符串连接起来,要转成StringBuffer,效率低,然后StringBuffer是可变的,可以直接连接多个字符串
作者: tanshion    时间: 2014-6-10 20:56
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
作者: See_the_sun    时间: 2014-6-10 21:16
String底层源代码 private final char value[]; 是一个不可以变的char类型字符数组 ,初始化后是一个不变的对象
StringBuffer,底层可变字符数组。使用append()f方法,返回值是StringBuffer,将任意类型数据,追加到缓冲区数组扩容,复制数组,并删除原数组。空参数的StringBuffer() ,自动创建一个16位的数组
频繁操作字符串,建立采用StringBuffer缓冲区对象,日后开发推荐使用StringBuilder,执行效率快
  StringBuilder也是一个字符串缓冲区
  StringBuilder和StringBuffer在方法上,和使用上一模一样,没有区别

区别在哪里:
StringBuffer 版本开始JDK1.0。StringBuffer是一个线程安全的对象
StringBuilder 版本开始JDK1.5。StringBuilder是一个线程不安全对象


   
   
作者: Rodgers    时间: 2014-6-11 01:47
从连接字符串的角度讲:
StringBuffer的append方法比“+”高效。
字符串连接操作中StringBuffer的效率要比String高:
每次使用String的 "+",都是new了一个新的String 对象,
而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
因此,当需要对字符串进行多次修改时,最好用StringBuffer。

作者: xiazhixing    时间: 2014-6-11 09:52
上面区别已经说得很清楚了,我说说两者的转换
从String到StringBuffer:  StringBuffer sb = New StringBuffer("abcd");
从StringBuffer到String:  String str = sb.toString();




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