首页 > 其他分享 >《StringBuilder类的数据结构和扩容方式解读》

《StringBuilder类的数据结构和扩容方式解读》

时间:2025-01-21 19:56:28浏览次数:3  
标签:sb2 容量 StringBuilder System 解读 println 数据结构 out

StringBuilder类的简单用法、数据结构和扩容方式解读

文章目录


前言

在之前的文章中和大家讲过String字符串类具有不可变性,今天给大家介绍一个可变字符串类——StringBuilder类。


提示:以下是本篇文章正文内容,下面案例可供参考

一、StringBuilder是什么?

和String类一样,StringBuilder类也是Java语言中编写好的一个类,它本身继承自

AbstractStringBuilder父类,有着final关键字声明,表示它不可以在被继承。

有着final关键字声明

二、使用方法

1.定义

代码如下(示例):

与String方法定义方式相同

 public static void main(String[] args) {
        StringBuilder s = new StringBuilder("Hello,world");
        System.out.println(s);
    }

运行结果如下:

2.基本方法介绍

代码如下(示例):

  (1).append()方法:在原字符串尾部追加新字符串内容;

  (2).insert()方法:在指定下标位置插入指定字符;

  (3).delete()方法:删除指定下标区域的字符;

  (4).reverse()方法:将原字符串反转;

  (5).replace()方法:将指定下标区域的字符替换成其他字符;

以下代码为以上五种简单方法的实现,以及运行结果:

public static void main(String[] args) {
        //StringBulider,可变字符串,直接在源字符串上修改

        StringBuilder sb2 = new StringBuilder("地震高岗");

        //尾部追加
        sb2.append("西山一派千古秀");//地震高岗西山一派千古秀
        System.out.println(sb2);

        //指定位置插入
        sb2.insert(2,'*');//地震*高岗西山一派千古秀
        System.out.println(sb2);

        //指定下标删除
        sb2.delete(2,3);
        System.out.println(sb2);//地震高岗西山一派千古秀

        //字符串反转
        sb2.reverse();
        System.out.println(sb2);//秀古千派一山西岗高震地

        sb2.replace(0,2,"#");
        System.out.println(sb2);//#千派一山西岗高震地

    }

运行结果如下:

三、StringBuilder内部数据结构

StringBuilder类在进行初始化时,无论是调用其无参构造方法或是有参构造方法,最终都指向其父类AbstractStringBuilder的有参构造方法。

其父类有参构造方法的代码如下,我们可以看出其内部数据存储仍是采用的char[ ]数组,这一点玉String类相同,但不同的是少了final关键字的声明,这就是StringBuilder字符串可变的原因。

四、扩容方式

1、扩容原理

  • StringBuilder 内部维护了一个字符数组 value,用于存储字符串数据。

  • 有一个 count 变量来记录当前存储的字符数量。

  • 当追加操作导致 count 达到或超过 value 数组的长度时,会触发扩容。

2、扩容步骤

  1. 检查容量
    • 在执行追加操作时,会调用 ensureCapacityInternal 方法,该方法会检查当前 value 数组的容量是否足够。

    • 若容量足够,继续追加操作;若不够,则触发扩容。

  2. 计算新容量
    • 新容量的计算规则通常是将原容量乘以 2 再加 2,即 newCapacity = (oldCapacity << 1) + 2

    • 但如果原容量为 0,则新容量将被设置为 10。

    • 另外,如果新容量仍然不够存储追加的内容,新容量将被设置为所需的最小容量,即 count + lenlen 是要追加的字符长度)。

  3. 创建新数组
    • 按照计算得到的新容量,创建一个新的字符数组。将原数组中的内容复制到新数组中。

    • 更新 value 数组为新数组。


3、代码如下(示例):

public class StringBuilderExpansion {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(5); // 初始容量为 5
        sb.append("Hello"); 
        System.out.println("当前容量: " + sb.capacity()); 
        sb.append(", World!"); 
        System.out.println("扩容后容量: " + sb.capacity()); 
    }
}

总结

今天给大家介绍了一个可变字符串类,StringBuilder类与Sting类有着诸多相同之处,但又一个根本的区别就是可变与不可变性。

标签:sb2,容量,StringBuilder,System,解读,println,数据结构,out
From: https://blog.csdn.net/cyf123__/article/details/145280315

相关文章

  • 数据结构2——线性表的链式存储
    前言顺序存储结构的缺点:①插入、删除操作需要移动大量的元素。② 预先分配空间需按最大空间分配,利用不充分。③表容量扩充十分不方便(可能会产生效率问题)。而链式存储结构恰好弥补了顺序存储这些缺陷。1.认识线性表链式存储1.1线性表链式存储的构成①可用一组任意......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • 《String类的equals()的作用和源代码解读》
    一、equals()方法的由来equals()最开始是定义在Java.lang包下的Object中的一个经行比较的方法,根据Object类的核心代码可以看出来,在Object类中equals()方法比较时使用“==”运算符来比较两者地址,但实际应用情况下,人们往往想比较两者的值是否相同,当两个相同的值存进不同内存地址时......
  • 单调队列:实用而好写的数据结构
    前言|Preface这几天连续做了好几道单调队列的题,难度从绿到蓝不等,摸索出了一些经验,也总结了一些单调队列的特点和规律。概述|Outline顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进......
  • 数据结构与算法之递归: LeetCode 39. 组合总和 (Ts版)
    组合总和https://leetcode.cn/problems/combination-sum/description/描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合candid......
  • 01 序论(数据结构实战)
    计算机的发展与用途:早期的计算机:最初,计算机主要是用来进行数学运算,像是加减乘除这种“数值计算”。它们主要用在科学研究、工程计算等需要大量数字计算的领域。现在的计算机:现代的计算机用途广泛,已经不仅仅局限于处理数字。它们还处理许多其他类型的数据,比如文字、表格、图片......
  • 数据结构-堆及堆排序
    1.堆的定义堆(Heap)是一种数据结构,通常是一个完全二叉树。在堆中,每个节点都有一个与其相关的值,并且满足堆的性质。堆分为两种类型:大堆和小堆。大堆:在大堆中,对于每个非叶子节点,其值都大于或等于它的子节点的值。也就是说,根节点的值是整个堆中的最大值。小堆:与大堆相反,在小堆中,对......
  • 【第一天】零基础入门刷题Python-算法篇-数据结构与算法的介绍(持续更新)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Python数据结构与算法的详细介绍1.基本概念2.Python中的数据结构1.列表(List)2.元组(Tuple)3.字典(Dictionary)4.集合(Set)5.字符串(String)3.Python中的常用算法1.排序算法2.搜索算法3.递......
  • String类的equals()的作用和源代码解读
    1. 了解equals()方法equals方法是用于比较两个对象是否相等的方法,定义在Object类中。其默认实现仅比较对象的引用地址,但可以通过重写方法实现对对象内容的比较。只有引用数据类型才可以使用equals方法,我们点进equals方法的源码:我们看代码前几行,观察到当传入进来的参数之间......
  • AAAI2024论文解读|Bidirectional Contrastive Split Learning for Visual Question An
    论文标题BidirectionalContrastiveSplitLearningforVisualQuestionAnswering双向对比分裂学习用于视觉问答论文链接BidirectionalContrastiveSplitLearningforVisualQuestionAnswering论文下载论文作者YuweiSun,HideyaOchiai内容简介本文提出了一种名......