首页 > 其他分享 >关于StringBuilder扩容机制的理解

关于StringBuilder扩容机制的理解

时间:2025-01-22 19:29:09浏览次数:3  
标签:扩容 minimumCapacity int StringBuilder value srcBegin 理解 srcEnd

一.为什么要用StringBuilder?

在java中由于字符串的不可变性,即一旦创建就不能修改其内容,每次使用String类进行字符串拼接时,都会创建一个新的String对象,原有的String对象会被丢弃,为了解决这一问题,我们引入了StringBuilder 类,StringBuilder 是一个可变的字符序列,允许在原对象上进行修改,避免了创建大量的中间对象。

二.StringBuilder的扩容原理分析

1.创建StringBuilder 对象:

StringBuilder sb=new StringBuilder();

2.调用 StringBuilder 的构造方法

 public StringBuilder() {
        super(16);
    }

3.调用父类 AbstractStringBuilder 的构造方法,创建一个初始容量为16的char[] value数组

 AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

4.调用append方法获取追加字符串长度
检查要追加的字符串,如果不为空,计算要追加的字符串长度,确保当前的 StringBuilder 有足够的容量存储追加的字符串。"你好呀"长度为3,ensureCapacityInternal(count + len),这里传入的值为3

for(int i=0;i<10;i++){
            sb.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;
    }

5.调用容量确认方法ensureCapacityInternal确认是否需要扩容
此时3-16<0,不需要扩容,所以执行下一句代码str.getChars(0, len, value, count);

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

调用str.getChars(0, len, value, count)给arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin)传值,此时value=3,srcBegin=0,srcEnd=追加的字符串长度=3dst是初始容量为16的char[] value数组,dstBegin=count=0

public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

进行第六次循环时,count = 15,len = 3,minimumCapacity = 18,此时执行ensureCapacityInternal方法需要扩容,新的容量newCapacity=16*2+2=34

 private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }
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;
    }

三.总结

创建 StringBuilder 时,初始容量为 16。
在 for 循环中,每次调用 append 方法时,计算 minimumCapacity。
前五次循环时,minimumCapacity 未超过初始容量 16,因此不需要扩容。
第六次循环时,minimumCapacity 超过了初始容量,触发扩容,新容量为 34 (16 * 2 + 2)。

标签:扩容,minimumCapacity,int,StringBuilder,value,srcBegin,理解,srcEnd
From: https://blog.csdn.net/weixin_64111255/article/details/145249227

相关文章

  • SSMCRM权限管理系统SSM架构下的CRM权限管理解决方案基于SSM框架的CRM权限管理系统设计
    计算机毕业设计SSMCRM权限管理系统4mo02标题 (配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着企业信息化进程的加速,客户关系管理(CRM)系统已成为企业运营的核心工具之一。然而,如何有效管理CRM系统中的权限,确保不同角色的用户能够......
  • 深入理解视图的创建与删除:数据库管理中的高级功能
    title:深入理解视图的创建与删除:数据库管理中的高级功能date:2025/1/21updated:2025/1/21author:cmdragonexcerpt:在现代数据库管理系统中,视图是一个重要的高级功能,可以为用户提供定制化的数据视图以满足特定需求。视图不仅能够简化复杂的查询,还能增强数据安全......
  • 深入理解检查约束:确保数据质量的重要工具
    title:深入理解检查约束:确保数据质量的重要工具date:2025/1/20updated:2025/1/20author:cmdragonexcerpt:在数据库管理中,检查约束是一种重要的约束类型,用于确保表中某一列或某些列的数据符合特定条件,从而维护数据的有效性和一致性。检查约束通过对数据的有效性......
  • 请问寻找网站模板修改的教程图片,以便更好地理解修改过程
     网站模板修改教程通常包含大量的图片,帮助用户更好地理解修改过程。以下是一些常见的教程图片类型:图片类型描述模板结构图展示模板的文件结构和各个文件的作用后台管理界面展示网站后台管理系统的界面和功能标签使用示例展示如何使用模板标签生成动态内容C......
  • 计算机毕业设计Springboot基于Java的医院床位管理系统 基于Spring Boot的Java医院床位
    计算机毕业设计Springboot基于Java的医院床位管理系统18b553a9(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着医疗行业的不断发展,医院床位管理系统的开发成为了提升医疗服务效率的关键环节。传统的人工管理方式不仅效率低下,还......
  • 一文速通stack和queue的理解与使用
    C++STL之stack和queue1.stack1.1.stack的基本概念1.2.stack的接口2.queue2.1.queue的基本概念2.2.queue的接口3.priority_queue3.1.priority_queue的基本概念3.2.priority_queue的接口3.3.仿函数4.容器适配器5.deque5.1.deque的简单了解5.2.deque的优缺点......
  • 【Linux网络】深入理解linux内核网络性能优化
    一、网络请求优化1.1减少不必要的网络IO在系统设计与开发过程中,应尽量避免不必要的网络I/O操作,尤其是在可以通过本地进程或内存内完成的场景下,避免使用网络通信来实现。网络虽然是现代分布式系统中的核心组件,能够连接不同模块、简化开发流程,并支持大规模系统的构建,但滥用网络会......
  • Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】
    Git理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件标签管理理解标签创建标签操作标签删除标签理解分布式版本控制系统我们⽬前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。而我们......
  • 《StringBuilder类的数据结构和扩容方式解读》
    StringBuilder类的简单用法、数据结构和扩容方式解读文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言在之前的文章中和大家讲过String字符串类具有不可变性,今天给大家介绍一个可变字符串类——StringBuilder类。提示:以下是本篇文章正文内......
  • Vue.js 进阶教程:深入理解 Vue 的功能和特性
    在上一篇教程中,我们学习了Vue.js的基础,掌握了如何创建Vue实例、如何使用数据绑定、以及如何处理简单的用户交互。在本篇教程中,我们将进一步探讨Vue.js的一些高级特性,帮助你构建更复杂的应用。1.Vue组件化开发Vue.js是一个基于组件的框架,组件是Vue应用的核心组......