StringBuilder 以及 StringBuffer默认大小与扩容

摘要:
默认值初始化:1.首先明确StringBuffer类和StringBuilder类继承抽象类AbstractStringBuilder类无参数构造方法。如果长度超过字符串,则存储为空
默认值初始化:

1.  首先明确 StringBuffer类与 StringBuilder类均继承了抽象类 AbstractStringBuilder类

StringBuilder 以及 StringBuffer默认大小与扩容第1张

无参构造方法
2. 源码中StringBuffer类和StringBuilder类初始化均调用父类的构造方法:
StringBuilder 以及 StringBuffer默认大小与扩容第2张

父类初始化:

StringBuilder 以及 StringBuffer默认大小与扩容第3张

子类默认传入值16 给父类初始化字符数组
 
有参构造方法:
 
StringBuilder 以及 StringBuffer默认大小与扩容第4张
扩容算法:
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
 
再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:
 
StringBuilder 以及 StringBuffer默认大小与扩容第5张
尝试将新容量扩为大小变成2倍+2   if 判断一下 容量如果不够,直接扩充到需要的容量大小;
 
 
随便说说:
集合中也有类似情况,ArrayList 和LinkedList也有默认值10 ,也有扩容算法采用的是右偏移1 + 原有长度  ==也就是变为1.5倍大小 ,如果不够用的话,就直接扩充到需要的大小;
 

String 类有一个 trim()方法 和 StringBuffer 与 StringBuilder类有一个trimToSize()方法需要节约内存的时候可以使用

StringBuilder 在创建实例的会给我们一个初始容量

StringBuilder stringBuilder = new StringBuilder();

System.out.println(stringBuilder.capacity());//初始容量为16

//StringBuilder的最大容量
//private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

StringBuilder继承了AbstractStringBuilder,new StringBuilder()会默认调用父类AbstractStringBuilder的构造函数创建一个容量为16的char数组

当追加之后的字符串大小大于大于当前容量时,StringBuilder会自动扩容,扩大到当前容量的2倍+2

StringBuilder 以及 StringBuffer默认大小与扩容第6张

转载:https://blog.csdn.net/tomorrow_one/article/details/108261478

https://blog.csdn.net/weixin_41240250/article/details/80476286

免责声明:文章转载自《StringBuilder 以及 StringBuffer默认大小与扩容》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python+OpenCV图像处理之模板匹配前端生成二维码/条形码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]C/C++:构建你自己的插件框架

本文译自GigiSayfan在DDJ上的专栏文章。GigiSayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构、开发和部署C/C++跨平台插件框架的文章的 第一篇 第一部分探索了一下现状,调查了许多现有的插件/组件库,深入研究了二进制兼容问题,并展现了一些该方案必要的一些属性。 后续的文章用一个例子展示了可用于...

【转】RO段、RW段和ZI段 Image$$??$$Limit 含义(zz)

作者评注:内容很多,不过解释讲解详细 http://www.cnblogs.com/heart-of-eagle/archive/2011/04/28/2032240.html 转载:          IMPORT |Image$$RO$$Limit|      IMPORT |Image$$RW$$Base|      IMPORT |Image$$Z...

基于STM32之UART串口通信协议(一)详解

一、前言 1、简介   写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教。 2、UART简介   嵌入式开发中,UART串口通信协议是我...

Linux套接字与虚拟文件系统(1):初始化和创建

http://www.cppblog.com/qinqing1984/archive/2015/05/03/210521.html 引言在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。对于网络套接字socket也是如此,除了专属的Berkeley Sockets...

Swift-可选值(Optional)讲解

前提:Swift中有规定:对象中的任何属性在创建时,都必须要有明确的初始化值 1.定义可选类型 方式一:常规方式(不常用) var name : Optional<String> = nil 方式二:语法糖(常用) var name:String? = nil Optional理解:   Optional也是Objective-C没有的数据类型...

SpringBoot启动过程解析(简化)

springBoot web方式启动过程 在这个启动过程中会有各种SpringBoot对外提供的扩展接口来对不同启动阶段进行自定义操作。 了解启动过程也是为了让我们更好理解SpringBoot提供的扩展接口使用   jar包启动或者外置war包启动都是调用SpringApplication.run()方法进行项目启动 tomcat会查询context上下文...