java源码分析(6)-StringBuffer

来源:互联网 发布:数据库实例 schema关系 编辑:程序博客网 时间:2024/06/06 01:43


StringBuffer

1.StringBuffer类

StringBuffer类由final修饰,故不能被继承,同时StringBuffer继承了AbstractStringBuilder,大量调用了AbstractStringBuilder中的方法,同时实现了java.io.Serializable接口,自定义了序列化方法,实现了CharSequence接口

public final class StringBuffer    extends AbstractStringBuilder    implements java.io.Serializable, CharSequence{public StringBuffer() {super(16);//默认容量为16    }public StringBuffer(int capacity) {super(capacity);    }public StringBuffer(String str) {super(str.length() + 16);//new StringBuffer时传入字符串,默认容量将变为字符串长度加16append(str);    }public StringBuffer(CharSequence seq) {        this(seq.length() + 16);        append(seq);    }

2.同步方法

StringBuffer中的方法基本与父类相同,但是都用synchronize修饰,以保证线程的安全性,同时也使得StringBuffer的性能大大降低。

所有可以修改属性的方法都实现了同步,防止出现两个线程同时修改StringBuffer的而出现线程安全问题

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 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) {        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 append(CharSequence s, int start, int end)     {        super.append(s, start, end);        return this;    }public synchronized StringBuffer append(char str[]) {         super.append(str);        return this;    }public synchronized StringBuffer append(char str[], int offset, int len) {        super.append(str, offset, len);        return this;    }public synchronized StringBuffer append(boolean b) {        super.append(b);        return this;    }public synchronized StringBuffer append(char c) {        super.append(c);        return this;    }public synchronized StringBuffer append(int i) {super.append(i);        return this;    }public synchronized StringBuffer appendCodePoint(int codePoint) {super.appendCodePoint(codePoint);return this;    }public synchronized StringBuffer append(long lng) {        super.append(lng);return this;    }public synchronized StringBuffer append(float f) {super.append(f);return this;    }public synchronized StringBuffer append(double d) {super.append(d);return this;    }

3.序列化(反序列化)方法的实现

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);//序列化value,count,false将他们放入对应的序列化属性域中        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);    }





0 0