jdk StringBuffer和StringBuilder源码学习

Stringbuffer和StringBuilder都继承AbstractStringBuilder抽象类,
大部分的逻辑处理都是在AbstractStringBuilder抽象类中实现的。
AbstractStringBuilder抽象类数据成员:

char[] value;   //字符数组
int count;      //字符数组长度

大部分append操作都是使用了以下方法


    //扩容的方法,把字符数字长度扩展到minimumCapacity
   private void ensureCapacityInternal(int minimumCapacity) {
       // overflow-conscious code
       if (minimumCapacity - value.length > 0) {
           value = Arrays.copyOf(value,
                   newCapacity(minimumCapacity));
       }
   }
    //扩容的大小计算,如果要求增加的大小,还小于原本的大小+2,就增加原来的大小+2的长度,。
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    } 

还有就是数组的复制,使用system类

    /*
     * @param      src      源数组
     * @param      srcPos   从源数组的srcpos下标开始
     * @param      dest     目标数组
     * @param      destPos  从源数组的destPos 下标开始
     * @param      length   复制的长度
     * 
     * */
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

StringBuilder的继承了AbstractStringBuilder抽象类
StringBuilder是线程不安全的
看源码可以发现大部分都是桥接作用,

    //没有实现逻辑,直接交给父类处理
    @Override
    public StringBuilder append(int i) {
        super.append(i);
        return this;
    }

而StringBuffer是线程安全的,
它的大部分逻辑也是交给父类处理的,和上面一样,
要说StringBuffer和StringBuilder的区别,基本上就是把大多数需要同步的方法加上了synchronized
如,和stringbuilder没有啥差别:

    @Override
    public synchronized StringBuffer append(int i) {
        toStringCache = null;//这个是用来toString的时候返回出去的字符数组,一旦有改动原来数组就要把这个缓存置空
        super.append(i);
        return this;
    }
    //下面是缓存
        @Override
    public synchronized String toString() {
        if (toStringCache == null) {//如果缓存不为空,就缓存一个
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值