StringBuilder源码解析

来源:互联网 发布:网络暴力数据分析 编辑:程序博客网 时间:2024/06/06 00:54

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

2.自定义StringBuilder代码:

// 一些具体功能实现,两个实现类 StringBuilder和StringBufferabstract 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

0 0