说说String与StringBuffe、StringBuilder之间的区别?

解决方案 »

  1.   

    String是一个商品
    StringBuffer/StringBuilder是生产这个商品的流水线,
    StringBuffer速度慢,但(线程)安全性高
    StringBuilder速度快,但(线程)安全性差
      

  2.   

    补充点 
    String为不可变得对象意味着每次都需要创建对象来进行重新复制
    StringBuffer则是可变的。效率上要高很多,因为不会产生垃圾对象
      

  3.   

    String 不可变 每次对其操作都会在数据池产生一个新的对象,不适合使用在对字符串进行频繁修改的场景
    StringBuffer和StringBuilder可变,对其修改不会产生新的对象 其两者区别在于StringBuffer线程安全而StringBuilder线程不安全
      

  4.   

    API上写的那么清楚。String 类是final,引用内存中的值不可变。引用数据量一大就不效率;
    StringBuffer 是用于频繁修改的,而且是线程安全;
    StringBuilder 我不怎么用,所以不了解,而且是线程不安全。如果只是用来声明一个变量的话就用String,如果用于字符串之间的频繁操作的话就用StringBuffer.
      

  5.   

    String是一个商品
    StringBuffer/StringBuilder是生产这个商品的流水线,
    StringBuffer速度慢,但(线程)安全性高
    StringBuilder速度快,但(线程)安全性差
    很恰当的。。
      

  6.   

    因为String是不可改变的,所以引入了StringBuilder和StringBuffer,StringBuffer是线程安全的,StringBuilder是线程非安全的效率比StringBuffer高
      

  7.   

    StringBuilder和StringBuffer是可变长的,经常用于追加。修改。删除 字符串。
      

  8.   

    stringbuilder比stringbuffer更有效率一些,java SE在不断更新,。stringbuffer都是老版本了。推荐用stringbuilder吧
      

  9.   

    String是不能变的字符串,而StringBuffer和StringBuilder都是可变的。StringBuilder效率比StringBuffer高,但是StringBuffer是线性安全的,而StringBuilder是不安全的
      

  10.   

        String   不可变字符序列
        StringBuffer  线程安全的可变字符序列
        StringBuilder  非线程安全的可变字符序列 
      

  11.   

    StringBuilder 是 StringBuffer的另一个版本, 是新加入的类, 用于只在一个线程中访问StringBuffer的情况下, 目的是为了提高性能. 
      

  12.   


    最普遍的误区之一:“StringBuffer/Vector/Hashtable 是线程安全的”“线程安全”是很复杂的事情,没有“通用”的解决方案,需要“因地制宜”,不要真的以为用了上述的类就真的“线程安全”了。事实是,StringBuffer/Vector/Hashtable 由于设计缺陷,几乎没什么用,事实上早就被废弃了。
      

  13.   

    String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类,即不能被继承.StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象它只能通过构造函数来建立,StringBuffer sb = new StringBuffer();note:不能通过付值符号对他进行付值. sb = "welcome to here!";//error对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中付值的时候可以通过它的append方法.sb.append("hello");StringBuilder:是一个可变对象和StringBuffer相比,不是线程安全的,一般用在单个线程操作的时候(这种情况很普遍,所以一般优先选用StringBuilder),速度比StringBuffe快很多。字符串连接操作中StringBuffer的效率要比String高:String str = new String("welcome to ");str += "here";的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后再将StringBuffer toSting();这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
      

  14.   

    String是不可改变的字符串,在内存中是不能改变大小的,也就是不能对指定的String字符串进行更改,但是StringBuffer是可以改变字符串大小的,可进行更改字符串StringBuffe类没怎么用过。
      PS:你可以查看java  API文档啊   上面有很详细的介绍
      

  15.   

    String 提供了数值不可变的字符串
    StringBuffer 提供了数值可变的字符串,且线程安全
    StringBuilder 提供了数值可变的字符串,但线程不安全
      

  16.   

    相同之处:都是基于char[]数组实现不同之处:
    String 在常量池中或堆中
    StringBuffer 是线程安全,append 方法被定义为synchronized  效率较低
        /**
         * Appends the specified <tt>StringBuffer</tt> to this sequence.
         * <p>
         * The characters of the <tt>StringBuffer</tt> argument are appended, 
         * in order, to the contents of this <tt>StringBuffer</tt>, increasing the 
         * length of this <tt>StringBuffer</tt> by the length of the argument. 
         * If <tt>sb</tt> is <tt>null</tt>, then the four characters 
         * <tt>"null"</tt> are appended to this <tt>StringBuffer</tt>.
         * <p>
         * Let <i>n</i> be the length of the old character sequence, the one 
         * contained in the <tt>StringBuffer</tt> just prior to execution of the 
         * <tt>append</tt> method. Then the character at index <i>k</i> in 
         * the new character sequence is equal to the character at index <i>k</i> 
         * in the old character sequence, if <i>k</i> is less than <i>n</i>; 
         * otherwise, it is equal to the character at index <i>k-n</i> in the 
         * argument <code>sb</code>.
         * <p>
         * This method synchronizes on <code>this</code> (the destination) 
         * object but does not synchronize on the source (<code>sb</code>).
         *
         * @param   sb   the <tt>StringBuffer</tt> to append.
         * @return  a reference to this object.
         * @since 1.4
         */
        public synchronized StringBuffer append(StringBuffer sb) {
            super.append(sb);
            return this;
        
    StringBuilder与StringBuffer 实现方式类似 非线程安全 效率高
        public StringBuilder append(String str) {
    super.append(str);
            return this;
        }StringBuffer 、StringBuilder父类都是AbstractStringBuilder
      

  17.   

    这个问题太经典了!
    简单来说,String长度不可变,StringBuffer和StringBuilder都是长度可变的。
    同时,StringBuffer是线程安全的,而StringBuilder是非线程安全的,
    所以,StringBuilder的效率要比StringBuffer高。但是String的效率是最低的,
    我做过实验,StringBuilder和StringBuffer的效率比String高100多倍,所以
    区别很显然,如果想详细了解它们的运行机制,介意楼主去看源码吧。
    楼主难道是最近面试被问到了吗?
      

  18.   

    我曾经做过测试分别在String和StringBuffer追加字符串"12345678901234567890"一百次,
    String越追加越慢,完成需要大概1分钟,StringBuffer仅需1秒。
    因为String每次追加需要创建对象。
      

  19.   

    各位 这么直白的说 不好理解 倒不如做这方面的题 做的越多越好 然后在参考大家的意见 会更加直观的理解,我想请求楼上的回答问题的各位 给推荐联系string、stringBuffer、stringbuilder的题库