JDK源码学习系列03----StringBuffer+StringBuilder

                         JDK源码学习系列03----StringBuffer+StringBuilder

由于前面学习了StringBuffer和StringBuilder的父类AbstractStringBuilder,他们俩的很多方法都是直接super了父类的,也为了较好的比较StringBuffer和StringBuilder,所以把二者放在同一博文中。

一.StringBuffer

1.静态类,不能被继承,实现了Serializable和CharSequence接口。

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
2.构造函数

public StringBuffer() {//StringBuffer的默认 容量 是16,注意是容量不是长度
	super(16);
    }
 
public StringBuffer(int capacity) {//也可以在初始化StringBuffer时为它指定容量,为了减少不必要的扩容,尽量在初始化StringBuffer时指定 容量
	super(capacity);
    }
 
 public StringBuffer(String str) {//若初始化StringBuffer时传入字符串,则 容量 为字符串长度+默认容量16
	super(str.length() + 16);
	append(str);
    }

 public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }
3.成员函数

方法大部分都定义为synchronized,这是StringBuffer和StringBuilder的最大区别,也就是StringBuffer是同步的,线程安全的,而StringBuilder是非线程安全的。当然嘛,上帝给你关了一扇门总是会为你开一扇窗的,StringBuffer是线程安全的但是效率上去略逊与StringBuilder.

由于几乎都是super的父类的,故不再累述,见我的前一篇JDK源码学习----AbstractStringBuilder   http://blog.csdn.net/sheepmu/article/details/26095203

 public synchronized int length() {
	return count;
    }

    public synchronized int capacity() {
	return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
	if (minimumCapacity > value.length) {
	    expandCapacity(minimumCapacity);
	}
    }

    public synchronized void trimToSize() {
        super.trimToSize();
    }
 
    public synchronized void setLength(int newLength) {
	super.setLength(newLength);
    }
 
    public synchronized char charAt(int index) {
	if ((index < 0) || (index >= count))
	    throw new StringIndexOutOfBoundsException(index);
	return value[index];
    }
  
    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 StringBuffer append(CharSequence s) {
        // Note, synchronization achieved via other invocations
        if (s == null)
            s = "null";
        if (s instanceof String)
            return this.append((String)s);
        if (s instanceof StringBuffer)
            return this.append((StringBuffer)s);
        return this.append(s, 0, s.length());
    }
 
    public synchronized StringBuffer delete(int start, int end) {
        super.delete(start, end);
        return this;
    }

   
    public synchronized StringBuffer deleteCharAt(int index) {
        super.deleteCharAt(index);
        return this;
    }
 
    public synchronized String substring(int start) {
        return substring(start, count);
    }
  
    public int indexOf(String str) {
	return indexOf(str, 0);
    }
 
    public synchronized int indexOf(String str, int fromIndex) {
        return String.indexOf(value, 0, count,
                              str.toCharArray(), 0, str.length(), fromIndex);
    }
 
    public synchronized StringBuffer reverse() {
	super.reverse();
	return this;
    }

    public synchronized String toString() {
	return new String(value, 0, count);
    }
 
    private static final java.io.ObjectStreamField[] serialPersistentFields = 
    { 
        new java.io.ObjectStreamField("value", char[].class), 
        new java.io.ObjectStreamField("count", Integer.TYPE),
        new java.io.ObjectStreamField("shared", Boolean.TYPE),
    };

    
    private synchronized void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        java.io.ObjectOutputStream.PutField fields = s.putFields();
        fields.put("value", value);
        fields.put("count", count);
        fields.put("shared", false);
        s.writeFields();
    }

   
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        java.io.ObjectInputStream.GetField fields = s.readFields();
        value = (char[])fields.get("value", null);
        count = (int)fields.get("count", 0);
    }
}
二.StringBuilder

1.静态类,不能被继承,实现了Serializable和CharSequence接口。  (同StringBuffer)

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
2.构造函数  (同StringBuffer)
 public StringBuilder() {
	super(16);
    }
 
    public StringBuilder(int capacity) {
	super(capacity);
    }
 
    public StringBuilder(String str) {
	super(str.length() + 16);
	append(str);
    }
 
    public StringBuilder(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }
3.成员函数  (与StringBuffer最大的区别就是非同步的)
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;
    }
 
    public StringBuilder append(CharSequence s) {
        if (s == null)
            s = "null";
        if (s instanceof String)
            return this.append((String)s);
        if (s instanceof StringBuffer)
            return this.append((StringBuffer)s);
        if (s instanceof StringBuilder)
            return this.append((StringBuilder)s);
        return this.append(s, 0, s.length());
    }
 
    public StringBuilder delete(int start, int end) {
	super.delete(start, end);
        return this;
    }
 
    public StringBuilder deleteCharAt(int index) {
        super.deleteCharAt(index);
        return this;
    }
 
    public StringBuilder insert(int index, char str[], int offset,
                                int len) 
    {
        super.insert(index, str, offset, len);
	return this;
    }
   
    public int indexOf(String str) {
	return indexOf(str, 0);
    } 
    public int indexOf(String str, int fromIndex) {
        return String.indexOf(value, 0, count,
                              str.toCharArray(), 0, str.length(), fromIndex);
    }
 
    public int lastIndexOf(String str) {
        return lastIndexOf(str, count);
    } 
    public StringBuilder reverse() {
	super.reverse();
	return this;
    }

    public String toString() {
        // Create a copy, don't share the array
	return new String(value, 0, count);
    } 





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: StringBuilderStringBuffer都是Java中的字符串缓冲区类,它们的作用是在字符串操作时提高效率。它们的主要区别在于线程安全性和性能。StringBuffer是线程安全的,但是性能相对较差;而StringBuilder则是非线程安全的,但是性能更好。在单线程环境下,建议使用StringBuilder,而在多线程环境下,建议使用StringBuffer。 ### 回答2: StringBuilderStringBuffer都是Java中用于操作字符串的类,它们之间的主要区别在于线程安全性和性能上的差异。 StringBuffer是一个线程安全的可变字符串类,它的方法都被synchronized关键字修饰,因此多个线程可以同时访问同一个StringBuffer对象,确保操作的原子性和一致性。这种线程安全性会带来额外的开销,在多线程环境下使用较为合适。 而StringBuilder是一个非线程安全的可变字符串类,它的方法没有被synchronized修饰,因此在单线程环境下性能比StringBuffer更好。由于不需要考虑线程安全性,StringBuilder的方法在执行速度上比StringBuffer更快,并且不会导致额外的开销。 除了线程安全性和性能上的差异,StringBuilderStringBuffer的使用方法几乎相同。它们都提供了一系列用于操作字符串的方法,例如追加字符串、插入字符串、删除字符串等。可以通过调用它们的构造函数来创建一个空的StringBuilderStringBuffer对象,并使用append()方法来进行字符串的操作。最后,通过调用toString()方法可以将结果转换为String类型。 综上所述,如果需要在多线程环境中操作字符串或者考虑线程安全问题,应该使用StringBuffer;如果在单线程环境中操作字符串或者追求更高的性能,应该使用StringBuilder。 ### 回答3: StringBuilderStringBuffer是Java中用于处理字符串的两个类,它们有很多相似之处,但也有一些不同点。 首先,它们的相似之处在于: 1. 都是可变的字符串类,可以通过添加、插入、删除和修改字符来操作字符串。 2. 都可以通过toString()方法获得最终的字符串结果。 3. 都是线程安全的,可以在多线程环境下使用,但StringBuffer的方法是同步的,而StringBuilder的方法是非同步的。 然而,它们的不同之处在于: 1. 效率:StringBuilderStringBuffer的效率更高,因为StringBuilder的方法是非同步的,不需要考虑线程安全问题,而StringBuffer的方法是同步的,需要进行线程安全的操作。 2. 可变性:StringBuilderJDK 1.5引入的,它是非线程安全的,因此在单线程环境下性能更好。而StringBufferJDK 1.0引入的,它是线程安全的,因此在多线程环境中性能较好。 3. 内部实现:StringBuilderStringBuffer都使用可变的字符数组来存储字符串,但是StringBuffer在对字符串进行修改时会创建一个新的字符数组,而StringBuilder则对原有的数组进行修改,减少了内存开销。 总的来说,如果在单线程环境下进行字符串操作,建议使用StringBuilder,因为它效率更高。而如果在多线程环境下进行字符串操作,建议使用StringBuffer,因为它是线程安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值