浅谈StringBuilder扩容机制(JDK1.8)

写博客这种事要不是靠自己技术过硬能提笔就来,要不就只能老老实实观百家所长,最后得出自己的理解(当然我这种老菜鸡是后者)
肚子里空空如也。想水个博客吧因为太菜也没什么好写的,要不是某些意外因素我真的不打算写这个。
各位就随便看看我吹水吧在这里插入图片描述

===========================================

StringBuilder继承了AbstractStringBuilder,它的大部分方法都是去调用AbstractStringBuilder中方法
在这里插入图片描述

先来看看,StringBuilder定义了默认的初始容量为16。

在这里插入图片描述

下面是AbstractStringBuilder的两个重要的变量(value、count)和构造器
在这里插入图片描述

​ 当进行append()方法调用时(以下都是传字符串的情况),它其实是去调用父类AbstractStringBuilder的append()方法
在这里插入图片描述
在这里插入图片描述

​ 这里的minimumCapacity是指已经存取的数组长度+需要存取的数组长度(即count和len),用这个判断下面是否需要扩容
在这里插入图片描述

​ 对于扩容操作,最精髓的就是ensureCapacityInternal()方法(所以这里详细说一说这个方法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eachg7NL-1601121781750)(/Users/haojunfan/Library/Application Support/typora-user-images/image-20200926191546272.png)]

​ 在ensureCapacityInternal中判断了以前的value是否满足现在需要的容量,如果不满足则扩容。将newCapacity(minimumCapacity)的结果拷贝给value

================关于MAX_ARRAY_SIZE和Integer.MAX_VALUE不知道的建议百度(又少写点字✅)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urJAX8Sp-1601121781751)(/Users/haojunfan/Library/Application Support/typora-user-images/image-20200926193600761.png)]

private int newCapacity(int minCapacity) {
        //这里的操作是将原来的长度*2+2
  		//("<<"为二进制中的左移一位,左移动一位相当于整体扩大二倍)
  		//至于为什么要+2,参考一下其他大佬的理解
  		//在使用StringBuilder的时候,append()之后,我们一般会在后面在加上一个分隔符
  		//例如逗号,也就是再加上一个char,而char在java中占2个字节,避免了因为添加分隔符而再次引起扩容。
        int newCapacity = (value.length << 1) + 2;	
  			//判断新的长度是否大于传入的minimumCapacity长度
  			//如果大于则满足初步的扩容需求,如果比minimumCapacity还小那就将minimumCapacity赋值给newCapacity
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
  			//这里是三目运算符,如果newCapacity <= 0(这里是因为newCapacity如果超过int的最大值2147483647就会变成它的最小值-2147483647)
  			//或是MAX_ARRAY_SIZE - newCapacity < 0时,调用hugeCapacity(minCapacity)重新计算。
  					//否则直接返回newCapacity,此时newCapacity就是最终扩容后长度
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)//注意这里传入的是minCapacity而不是上面重新计算过的newCapacity
            : newCapacity;
    }

    private int hugeCapacity(int minCapacity) {
      	//如果这里的Integer.MAX_VALUE比minCapacity小则抛出OOM(溢出异常)
        if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
            throw new OutOfMemoryError();
        }
        return (minCapacity > MAX_ARRAY_SIZE)
            ? minCapacity : MAX_ARRAY_SIZE;
    }

======================================================================
好了,就写到这儿了,又水了一篇,我要去看书了在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值