StringBuilder源码解析

1.StringBuilder是线程不安全的,里面的char[]是可变的,增删改操作都是依赖System.arraycopy 函数来实现的。StringBuilder会默认构造16个长度,当后面修改到超过时会自动扩容到(char[].length+ 1) * 2,这就是比String效率高的原因,不用像String一样容量不够就重新构造对象,StringBuilder会自动扩容。

2.自定义StringBuilder代码:

// 一些具体功能实现,两个实现类 StringBuilder和StringBuffer
abstract class AbstractStringBuilder {
    char value[];
    // 并不等于value.length 当前 有效字符串的长度
    int count;

    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
    public AbstractStringBuilder append(String str) {
        if (str == null)
            str = "null";
        int len = str.length();
        if (len == 0)
            return this;
        int newCount = count + len;// 两个字符串之和
        if (newCount > value.length) // char[] 空间不够了
            expandCapacity(newCount);
        // 把 str 用 System.arraycopy 复制到value中
        str.getChars(0, len, value, count);
        count = newCount;
        return this;
    }

    void expandCapacity(int minimumCapacity) {
        // 扩大 (value.length + 1) * 2
        int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
        }
        // 用System.arraycopy 来复制 value并 扩大newCapacity长度
        value = Arrays.copyOf(value, newCapacity);
    }

    public AbstractStringBuilder delete(int start, int end) {
        int len = end - start;// 要删除字符串的长度
        if (len > 0) {
            /**
             * 把要删除的字符串之后的的字符串 ,前移到删除的位置, 就表示 删除了字符串,
             */
            System.arraycopy(value, start + len, value, start, count - end);
            count -= len; // 有效长度 减去删除的长度
        }
        return this;
    }
    public AbstractStringBuilder insert(int offset, String str) {
        int len = str.length();
        int newCount = count + len;
        if (newCount > value.length)// 容量不够 ,扩容
            expandCapacity(newCount);
        // 把 insert位置的len个长度 空出来
        System.arraycopy(value, offset, value, offset + len, count - offset);
        // 把str拷贝到 value中
        str.getChars(value, offset);
        count = newCount;
        return this;
    }
}
//StringBuilder类
class MyStringBuilder extends AbstractStringBuilder {
    public MyStringBuilder() {
        super(16);// 默认构造 16 个长度的char数组
    }

    // 添加字符串,父类实现
    public MyStringBuilder append(String str) {
        super.append(str);
        return this;
    }
    // 删除
    public MyStringBuilder delete(int start, int end) {
        super.delete(start, end);
        return this;
    }
    // 插入
    public MyStringBuilder insert(int offset, String str) {
        super.insert(offset, str);
        return this;
    }
    // 重新构造一个String
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
}

分析了几个重要方法,都是System.arraycopy来操作char[] 实现的。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值