解决StringBuffer和StringBuilder的扩容问题

 更新时间:2021年7月14日 15:00  点击:1670

StringBuffer和StringBuilder的扩容

以前对StringBuffer/StringBuilder只是初浅的了解,只是知道StringBuffer是线程安全的,Stringbuilder是非线程安全的。并且字符串长度是可变的。

具体是怎么变没有去深入了解,今天看了一下源码,恍然大悟

来看一下源码,在没有传参的情况下默认初始容量是16。

有参数的情况下,初始容量是16+字符串的长度,并且是用append()方法追加的字符。

到这里就有疑问那,那这个字符串的长度是多少呢。是它本身的长度还是16+它自身的长度,来接着往下看。一路追寻append()方法终于找到答案了。

注意,这个len居然是String自身的长度,现在明白了吧。其实平时咱们也在用str.length();方法就是没注意它的长度是怎么来的。

忽然又想到一个问题,那要是在追加字符串的时候长度比16大怎么办,我们看到有个ensureCapacityInternal()的方法,追进去看看,然后发现它是这么扩容的

int newCapacity = (value.length << 1) + 2;

增加为自身长度的一倍然后再加2;这个时候如果还是放不下,那就直接扩容到它需要的长度

newCapacity = minCapacity;

StringBuilder扩容规则

StringBuilder默认的创建的时候开辟的char数组的大小

StringBuilder() default 16
StringBuilder("Str") default Str.length()+16

StringBuilder sb扩容的规则:

当调用sb.append()的时候每次都会对当前容量进行判断

StringBuilder.append

确定下需要的最小的容量(已经存储的数据长度+准备存储的数据的长度)是否大于存储的char数组的长度,如果大于就在newCapacity扩容

ensureCapacityInternal

判断扩容当前char数组长度的2倍+2的长度是否满足扩容需求,不满足设置为存储的数据长度+准备存储的数据的长度,判断append扩容是否超过MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8),如果是抛出异常OutOfMemoryError

newCapacity

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • js实现C#的StringBuilder效果完整实例

    这篇文章主要介绍了js实现C#的StringBuilder效果,以完整实例形式分析总结了js实现C#的StringBuilder效果的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2015-12-24
  • Golang Map实现赋值和扩容的示例代码

    这篇文章主要介绍了Golang Map实现赋值和扩容的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-11
  • java中stringbuffer线程安全分析实例详解

    在本篇文章里小编给大家整理的是一篇关于java中stringbuffer线程安全分析实例详解内容,有兴趣的朋友们可以学习下。...2021-01-18
  • C#中StringBuilder类的使用总结

    本篇文章主要是对C#中StringBuilder类的使用方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
  • C#中String StringBuilder StringBuffer类的用法

    这篇文章给大家简单介绍下C#中String StringBuilder StringBuffer三个类的用法,需要的的朋友参考下吧...2020-06-25
  • 详解java中String、StringBuilder、StringBuffer的区别

    这篇文章主要介绍了java中String、StringBuilder、StringBuffer的区别,文中讲解的很清晰,有对于这方面不太懂的同学可以研究下...2021-02-25
  • 深入理解StringBuilder的使用方法

    下面小编就为大家带来一篇深入理解StringBuilder的使用方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 详解C++中StringBuilder类的实现及其性能优化

    在Java和C#中,StringBuilder可以创造可变字符序列来动态地扩充字符串,那么在C++中我们同样也可以实现一个StringBuilder并且用来提升性能,下面就来详解C++中StringBuilder类的实现及其性能优化...2020-04-25
  • SpannableString与SpannableStringBuilder使用

    下面我们一起来看一个关于SpannableString与SpannableStringBuilder使用例子了,希望这个例子能够对各位同学带来有效帮助的哦。 1、SpannableString、SpannableStr...2016-09-20
  • 手机扩容神器,金士顿高速TF卡速度赶超U盘!

    随着手机成为我们生活中的重要设备,我们对它的依赖性越来越大!这个小小的设备成为了我们的拍照利器、追剧神器、游戏利器,带给我们欢乐的同时,手机容量也成为了我们日常使用的瓶颈,不过好在安卓系的大部分手机目前都支持外接扩容,所以一张高品质的TF卡就成为了我们扩容神器。...2016-09-12
  • C#中StringBuilder用法以及和String的区别分析

    当我们在初学使用C#时,常常会不知道该用StringBuilder合适还是用String高效,下面是我在学习当中对StringBuilder和String的区别总结,分享给大家。...2020-06-25
  • C# 利用StringBuilder提升字符串拼接性能的小例子

    一个项目中有数据图表呈现,数据量稍大时显得很慢,在使用了StringBuilder后效果提升很明显,下面有例子...2020-06-25
  • C#中String和StringBuilder的简介与区别

    今天小编就为大家分享一篇关于C#中String和StringBuilder的简介与区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
  • C#使用String和StringBuilder运行速度测试及各自常用方法简介

    今天小编就为大家分享一篇关于C#使用String和StringBuilder运行速度测试及各自常用方法简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
  • string与stringbuilder两者的区别

    今天小编就为大家分享一篇关于string与stringbuilder两者的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
  • 基于hashmap 的扩容和树形化全面分析

    这篇文章主要介绍了hashmap 的扩容和树形化的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-11
  • 浅析C#中StringBuilder类的高效及与String的对比

    StringBuilder类所创造出来的字符串对象在拼接操作等方面比普通的string类往往要高效很多,这是它们在内存划分方式上的不同所决定的,下面就来浅析C#中StringBuilder类的高效及与String的对比...2020-06-25
  • 详解.NET中string与StringBuilder在字符串拼接功能上的比较

    string与StringBuilder的在字符串拼接时执行效率上有差异,这篇文章主要介绍了详解.NET中string与StringBuilder在字符串拼接功能上的比较,感兴趣的小伙伴们可以参考一下...2021-09-22
  • C#中的char、string和StringBuilder的使用详解

    这篇文章主要介绍了C#中的char、string和StringBuilder的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • 解决StringBuffer和StringBuilder的扩容问题

    这篇文章主要介绍了解决StringBuffer和StringBuilder的扩容问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-14