StringBuffer与StringBuilder的区别

来源:互联网 发布:淘宝怎么买黑客肉鸡 编辑:程序博客网 时间:2024/06/06 02:10

查看Java(1.6)源码发现StringBuffer与StringBuilder的定义如下:

 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}

可见,StringBuffer与StringBuilder拥有共同的父类AbstractStringBuilder,并实现了相同的接口java.io.Serializable, CharSequence


接着阅读代码,发现StringBuffer与StringBuilder的大部分方法都类似,不同的地方是,StringBuffer的大部分方法都用Synchronized修饰,而StringBuilder没有。例如

  public synchronized StringBuffer append(Object obj) {super.append(String.valueOf(obj));        return this;    }    public synchronized StringBuffer append(String str) {super.append(str);        return this;    }    public synchronized StringBuffer append(StringBuffer sb) {        super.append(sb);        return this;    }
 public StringBuilder append(Object obj) {return append(String.valueOf(obj));    }    public StringBuilder append(String str) {super.append(str);        return this;    }    private StringBuilder append(StringBuilder sb) {if (sb == null)            return append("null");int len = sb.length();int newcount = count + len;if (newcount > value.length)expandCapacity(newcount);sb.getChars(0, len, value, count);count = newcount;        return this;    }    public StringBuilder append(StringBuffer sb) {        super.append(sb);        return this;    }


可见,StringBuffer是保证操作同步的,可以安全地用于多线程,可以在必要时对这些方法同步,因此特定实例上的操作就好像串行发生一样; StringBuilder不是线程安全的,可以理解为StringBuffer的一个简易替代,用于字符串缓冲区只被单个线程使用的情况(很普遍)。因此如何只在单个线程中操纵字符串,优先使用StringBuilder,由于不用同步控制,所以速度比StringBuffer要快。


继续阅读代码,StringBuffer和StringBuilder的共同父类AbstractStringBuilder的部分代码如下,

abstract class AbstractStringBuilder implements Appendable, CharSequence {    /**     * The value is used for character storage.     */    char value[];    /**      * The count is the number of characters used.     */    int count;    ...}
 public int length() {return count;    }    public int capacity() {return value.length;    }    public void ensureCapacity(int minimumCapacity) {if (minimumCapacity > value.length) {expandCapacity(minimumCapacity);}    }    void expandCapacity(int minimumCapacity) {int newCapacity = (value.length + 1) * 2;if (newCapacity < 0) {newCapacity = Integer.MAX_VALUE;} else if (minimumCapacity > newCapacity) {newCapacity = minimumCapacity;}        value = Arrays.copyOf(value, newCapacity);    }
可见,StringBuffer与StringBuilder的底层实现都是基于数组,并且支持动态扩展容量的。

附:String与StirngBuilder的区别

       String的定位是字符串常量的表示,在涉及到字符串拼接时,由于String对象不可变,因此是生成新的字符串对象。而StringBuilder则不用生成新的对象。

从JDK1.5开始,带有字符串的连接操作(+),JVM内部采用的是StringBuilder来实现的(即源码编译后的实现)。

参看:http://www.jb51.net/article/86551.htm




0 0