java.lang.StringBuffer源码解析

一、概要:

  • 线程安全的可变字符序列。可以通过调用一些方法来改变StringBuilder的长度和内容。里面的每个方法都被synchronized 关键字修饰。

  • 字符串缓冲区可安全用于多个线程。这些方法在必要时进行同步,以使任何特定实例上的所有操作都表现为好像以某种串行顺序发生,该顺序与所涉及的每个单独线程进行的方法调用的顺序一致。

  • 从JDK5开始,java添加了一个等效类StringBuilder,该类用户单个线程,不执行同步,线程不安全,这样执行相同的操作时StringBuilder更快。

  • 每当发生涉及源序列的操作(例如从源序列追加或插入)时,此类仅在执行作的字符串缓冲区上同步,而不在源上同步

二、实现接口和继承类:

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

  • 实现序列化接口。在序列化接口中并没有任何属性和方法,就用于表示
    可序列化的VO类如果没有实现序列化,Java类的属性值会在程序执行
    完毕之后被释放,这样就不能将这个类进行网络传输,为了能够在以后
    取出这个对象来使用、传输和保存,可以实现序列化接口,将对象写入
    内存,变成可存储可传输的状态,需要使用的时候就可以进行反序列
    化,就是重新生成相同的对象实例。实现序列化在项目VO类中经常使
    用到,如果没有实现会报错误

  • 实现CharSequence接口。

  • 继承AbstractStringBuilder类。

三、变量:

//toString返回的最后一个值的缓存。每当修改StringBuffer时清除。
private transient char[] toStringCache;
//序列化ID在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本
//地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以
//进行反序列化,否则就会报序列化版本不一致的异常
static final long serialVersionUID = 3388685877147921107L;

四、构造器

    // 初始容量为16
    public StringBuffer() {
        super(16);
    }
    
    //指定容量
    public StringBuffer(int capacity) {
        super(capacity);
    }
    
    //构造一个初始化为指定字符串内容的字符串,容量为字符串参数长度加上16
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }
    
    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }
继承CharSequence的方法
    //返回字符串的长度
    @Override
    public synchronized int length() {
        return count;
    }
    
    //返回当前字符串的容量
    @Override
    public synchronized int capacity() {
        return value.length;
    }
    
    //返回指定位置的字符
    @Override
    public synchronized char charAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    }
继承AbstractStringBuilder 

    //修改容量
    @Override
    public synchronized void setLength(int newLength) {
        toStringCache = null;
        super.setLength(newLength);
    }
    //等价与将容量改为与当前字符串长度相等的值
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }
    //还有各种append
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
    //将原字符的start开始到end结束的字符替换为参数str
    @Override
    public synchronized StringBuffer replace(int start, int end, String str) {
        toStringCache = null;
        super.replace(start, end, str);
        return this;
    }
    
    //返回从start开始到尾部的字符串
    @Override
    public synchronized String substring(int start) {
        return substring(start, count);
    }
    //将字符串插入指定位置
    @Override
    public synchronized StringBuffer insert(int offset, String str) {
        toStringCache = null;
        super.insert(offset, str);
        return this;
    }
    
    //返回首次出现str的下标
    @Override
    public int indexOf(String str) {
        // Note, synchronization achieved via invocations of other StringBuffer methods
        return super.indexOf(str);
    }
    
    //反转字符串
    @Override
    public synchronized StringBuffer reverse() {
        toStringCache = null;
        super.reverse();
        return this;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值