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、扩容步骤
- 检查容量:
-
在执行追加操作时,会调用
ensureCapacityInternal
方法,该方法会检查当前value
数组的容量是否足够。 -
若容量足够,继续追加操作;若不够,则触发扩容。
-
- 计算新容量:
-
新容量的计算规则通常是将原容量乘以 2 再加 2,即
newCapacity = (oldCapacity << 1) + 2
。 -
但如果原容量为 0,则新容量将被设置为 10。
-
另外,如果新容量仍然不够存储追加的内容,新容量将被设置为所需的最小容量,即
count + len
(len
是要追加的字符长度)。
-
- 创建新数组:
-
按照计算得到的新容量,创建一个新的字符数组。将原数组中的内容复制到新数组中。
-
更新
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