java源码分析(6)-StringBuffer

原创 2016年06月01日 11:21:56


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时传入字符串,默认容量将变为字符串长度加16
	append(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);
    }





版权声明:本文为博主原创文章,未经博主允许不得转载。

Java字符串:StringBuffer使用详解及源码分析

1 使用方法  StringBuffer和StringBuilder功能基本相同,他们的区别在于StringBuffer是线程安全的而StringBuilder不是线程安全的。他们的关系和HashMa...

Java源码分析之StringBuilder,StringBuffer

这两个类极为相似,都是继承自AbstractStringBuilder,并且都实现了Serializable, CharSequence,区别也很明显,StringBuilder不支持多线程,而Str...

Java StringBuilder和StringBuffer源码分析

Java StringBuilder和StringBuffer源码分析

Java源码分析--StringBuffer/StringBuilder

在Java中,使用StringBuffer和StringBuilder这两个类表示可变长字符串,这篇博文用来探讨这两个类的源码分析。 继承关系 这两个类的继承关系完全一样,都是如下所示: public...

从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别

字符串,就是一系列字符的集合。    Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增...
  • kinbos
  • kinbos
  • 2016年09月26日 16:43
  • 153

Java源码阅读之StringBuffer

文中出现的代码大多来自于openjdk-8,其下载地址为:http://download.java.net/openjdk/jdk8; 已将部分关键代码上传至https://github.com/ev...

java源码解读之String,StringBuilder,StringBuffer

由于最近正好毕业了,正在找工作~~~
  • zeq9069
  • zeq9069
  • 2014年06月14日 10:44
  • 1431

从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别

字符串,就是一系列字符的集合。 Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的...
  • hj7jay
  • hj7jay
  • 2016年10月09日 20:31
  • 2853

跟我一起读源码(java)—String、StringBuffer、StringBuilder

写在前面:之所以写这个系列,是因为实习期间相对还算不太忙,想看看源码,学习学习,仅此而已,写的不对的地方,还请大家多多指正(博主用的版本是1.8.0)。。。我不知道如何学习源码,网上源码谈的比较多的都...

Java源码阅读-StringBuffer

StringBuffer继承AbstractStringBuilder类,同时实现Serializable序列化和CharSequence接口 默认构造方法StringBuffer()会创建一个1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java源码分析(6)-StringBuffer
举报原因:
原因补充:

(最多只允许输入30个字)