StringBuilder初始化容量以及扩容机制(源码分析)

我们从源码来分析一下StringBuilder的底层原理:

 

/*** Constructs a string builder with no characters in it and an* initial capacity of 16 characters.*/public StringBuilder() {super(16);}

定义一个无参的StringBuilder时,初始化容量为16.例如:StringBuilder sb = new StringBuilder();

/*** Constructs a string builder with no characters in it and an* initial capacity specified by the {@code capacity} argument.** @param      capacity  the initial capacity.* @throws     NegativeArraySizeException  if the {@code capacity}*               argument is less than {@code 0}.*/public StringBuilder(int capacity) {super(capacity);}

定义参数为整数大小StringBuilder时,调用父类(AbstractStringBuilder)的初始化方法。例如:StringBuilder sb = new StringBuilder(5);

/*** Creates an AbstractStringBuilder of the specified capacity.*/AbstractStringBuilder(int capacity) {value = new char[capacity];}

AbstractStringBuilder的构造方法就是建立一个容量与参数大小一致的对象。

当参数为一个字符串时,例如:StringBuilder sb = new StringBuilder("abcdefghj")时

 public StringBuilder(String str) {super(str.length() + 16);append(str);}

大小为16加上参数字符串的大小。

接下来我们来看看StringBuilder的扩容机制

当上面调用有字符串参数的构造方法时,底层调用了一个append()方法

 public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}

append()方法如上所示,我们需要判断容量是否足够,通过ensureCapacityInternal()方法

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}

value表示的是现在的字符串容量大小,当我们现在需要存的字符串大小大于原理的容量,进行复制扩容,调用了newCapacity()方法

private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity = (value.length << 1) + 2;if (newCapacity - minCapacity < 0) {newCapacity = minCapacity;}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;}private int hugeCapacity(int minCapacity) {if (Integer.MAX_VALUE - minCapacity < 0) { // overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE;}

底层会先把容量大小扩充为原来大小的2倍+2,如果还不够,则调用hugeCapacity()直接把容量大小扩展为需要的容量大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫爬取百度词条

页面是随时升级的&#xff0c;所以现在的链接不代表以后的链接&#xff0c;但是万变不离其宗&#xff0c;只要学会解析页面&#xff0c;那么就能走的更远。 码云链接&#xff1a;https://gitee.com/ALADL/baike_spider.git from baike_spider import url_manager,html_download…

模仿大脑:下一代计算机

《环球科学》供图光明图片/视觉中国光明图片/视觉中国文章来源&#xff1a;光明日报作者&#xff1a;茱莉格洛利耶【环球科技】引 言在过去几年中&#xff0c;人工智能算法取得了巨大的进步。它在我们日常生活中的应用越来越普遍&#xff0c;经常被用于分析文本或图片的内容&a…

Leetcode--210.课程表Ⅱ

现在你总共有 n 门课需要选&#xff0c;记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1 &#xff0c;我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件&#xff0c;返回你为了学完所…

前后端分离使用 Token 登录解决方案

前后端分离使用 Token 登录解决方案&#xff1a;https://juejin.im/post/5b7ea1366fb9a01a0b319612转载于:https://www.cnblogs.com/bydzhangxiaowei/p/9768945.html

新能源关键技术预见的研究

来源&#xff1a;微信公众号科学家&#xff0c;原载于《今日科苑》2020年第11期作者&#xff1a;刘进萍、卢世刚1. 引言新能源是指采用新技术和新材料正在开发利用的新型能源&#xff0c;既包括风能、太阳能、生物质能等可再生能源&#xff0c;也包括核能、氢能等其他非化石能源…

Leetcode--152. 乘积最大子数组(java)

给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出…

淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】

json package com.taotao.common.utils;import java.util.List;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper;public class JsonUtils {// 定义jackson对…

谷歌前CEO:美国科技优势面临最危险时刻

文章来源&#xff1a;VOA&#xff0c;2021-03-28 &#xff0c;不代表本平台立场图片来源&#xff1a;GETTY IMAGES、知乎、网络等编辑&#xff1a;阿丽西娅中国在人工智能&#xff08;AI&#xff09;发展的多项指标上直逼美国优势&#xff0c;有些领域甚至已经实现超越。许多分…

HashMap源码分析(搞懂HashMap看这个就够了)

首先来看看HashMap&#xff0c;从构造函数看起 HashMap有四个构造函数 第一个&#xff1a; public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; // all other fields defaulted} 无参的构造函数&#xff0c;初始容量为默认的16不变&#xff0c;loadFactor为负载因子…

CoreJava学习第五课 --- 进入第二阶段:面向对象编程思想

面向对象编程思想 1.面向过程 ​ 从计算机执行角度出发 &#xff0c;代码执行过程核心为从程序的运行过程出发,构建编程思路,例&#xff1a; 哥德巴赫猜想 // 面向过程1 用户输入一个数n2 验证数字的正确性2.1 正确就继续向下2.2 错误就重复输入3 拆数 循环 nab4.判断 a和b同…

波士顿动力的仓库机器人Strentch来了,挑战每小时搬运800个箱子

来源&#xff1a; 雷锋网作者&#xff1a;杨丽编译&#xff1a;TheVerge雷锋网讯&#xff0c;波士顿动力以其机器狗Spot和双足人形机器人Atlas而闻名。不过近年来&#xff0c;该公司开始将目光投放到物流领域&#xff0c;并于日前发布了一款名为Strentch的新型仓库物流机器人。…

Leetcode--1371. 每个元音包含偶数次的最长子字符串(Java)

给你一个字符串 s &#xff0c;请你返回满足以下条件的最长子字符串的长度&#xff1a;每个元音字母&#xff0c;即 a&#xff0c;e&#xff0c;i&#xff0c;o&#xff0c;u &#xff0c;在子字符串中都恰好出现了偶数次。 示例 1&#xff1a; 输入&#xff1a;s "elee…

下一代人工智能

来源&#xff1a;人机与认知实验室翻译&#xff1a;朱浩然摘要&#xff1a;人工智能和机器学习的最新研究在很大程度上强调了通用学习和越来越大的训练集以及越来越多的计算。相反&#xff0c;我提出了一种以认知模型为中心的混合&#xff0c;知识驱动&#xff0c;基于推理的方…

Leetcode--5. 最长回文子串(java)

给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1&#xff1a; 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2&#xff1a; 输入: "cbbd" 输出: "bb"…

图论-第k短路

A* 做法 \(f(p)g(p)h(p)\) &#xff0c; \(f(p)\) 作为优先队列比较函数用来比较的值&#xff0c; \(g(p)\) 是当前路径到 \(p\) 的距离&#xff0c; \(h(p)\) 是 \(p\) 点到终点最短路&#xff08;预处理可以得到&#xff09;。 每个点出队次数 \(k\)&#xff0c;就说明当前找…

Arm十年最大更新:V9架构正式发布

来源&#xff1a;由半导体行业观察&#xff08;ID:icbank&#xff09;编译&#xff1a;「anandtech」自Arm在2011年10月首次发布Armv8架构以来&#xff0c;已经过去了近十年的时间。这对Arm来说是一个相当可观的十年&#xff0c;因为在这段时间内&#xff0c;他们的指令集架构受…

输出错误信息

在error页面加以下代码&#xff0c;之后检查网页源代码就会出现错误信息 (URL,Exception是后台传过来的参数) <div><div th:utext"<!--" th:remove"tag"></div><div th:utext"Failed Request URL : ${url}" th:remove…

Lodop打印设计界面生成代码带”...(省略)”

Lodop的设计界面中&#xff0c;菜单里的生成代码&#xff0c;如果打印项内容过多&#xff0c;后面会显示”...(省略)”&#xff0c;省略的是打印项的内容值&#xff0c;无论是纯文本还是超文本&#xff0c;都可以用选中打印项-右键-设置属性里找到该打印项的全部值&#xff0c;…

南洋理工大学研发植物“通信”设备,未来可成为环境探测器

来源&#xff1a;MEMS 最新研究成果由新加坡南洋理工大学&#xff08;NTU&#xff09;领导的一个科学家团队开发了一种可以向植物发送电信号和从植物接收电信号的设备&#xff0c;为利用植物的新技术打开了大门。团队的发现于今年1月25日刊登于国际知名科学期刊《自然》属下的…

服务器核心知识

电脑&#xff1a;辅助人脑的工具 现在的人们几乎无时无刻都会碰电脑&#xff01;不管是桌上型电脑(桌机)、笔记型电脑(笔电)、平板电脑、智慧型手机等等&#xff0c;这些东西都算是电脑。虽然接触的这么多&#xff0c;但是&#xff0c;你了解电脑里面的元件有什么吗&#xff1f…