Java从入门到放弃 · 浅谈StringBuilder类

449 阅读3分钟

“这是我参与8月更文挑战的第18天,活动详情查看: 8月更文挑战

StringBuilder类

StringBuilder类的原理

StringBuilder叫做字符缓冲区,可以提高字符串的操作效率(可以看成一个长度可变的字符串),底层也是一个数组,但是没有final修饰,可以改变长度。

byte[] value = new byte[16]

StringBuilder类的底层数组初始大小是16,如果超出了容量,StringBuilder会自动扩容。

StrigBuilder类的构造方法

public StringBuilder(String str)

构造一个字符串生成器,并初始化为指定的字符串内容。该字符串生成器的初始容量为 16 加上字符串参数的长度。 

参数:
str - 缓冲区的初始内容。 

public StringBuilder()

构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。

public StringBuilder(int capacity)

构造一个不带任何字符的字符串生成器,其初始容量由 capacity 参数指定。

public StringBuilder(CharSequence seq)

构造一个字符串生成器,包含与指定的 CharSequence 相同的字符。该字符串生成器的初始容量为 16 加上 CharSequence 参数的长度。 

参数:
seq - 要复制的序列。

StringBuilder类有四个构造方法,我们主要学习前两个即可。

StringBuilder的成员方法

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

append()方法

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

append有很多重载的方法,可以添加任意类型的字符串,并返回当前对象本身。

image.png

StringBuilder sb = new StringBuilder();
sb.append("abc");
sb.append(1);
sb.append(3.3);
sb.append('d');
sb.append(true);
System.out.println(sb);

image.png 对于append来说,返回的是它本身这个对象,因此可以使用链式编程的方式可以达到上面的效果,而且更简单。

StringBuilder sb = new StringBuilder();
sb.append("abc").append(1).append(3.3).append('d').append(true);
System.out.println(sb);

image.png

insert()方法

public StringBuilder insert(int offset,String str)

将字符串插入此字符序列。 
按顺序将 String 参数中的字符插入此序列中的指定位置,将该位置处原来的字符向后推,此序列将增加该参数的长度。如果 str 为 null,则向此序列中追加 4 个字符 "null"

insert方法和append方法类似,不过是多了一个索引的参数,这里就不再缀述。

toString()方法

StringBuilder和String可以相互转换。

String->StringBuilder,通过StringBuilder的构造方法。

StringBuilder(String str)

StringBuilder->String,通过StringBuilder的toString()方法。

public String toString()

返回此序列中数据的字符串表示形式。将分配一个新的 String 对象,并将它初始化,以包含当前由此对象表示的字符串序列。然后返回此 String。对此序列的后续更改不影响该 String 的内容。

写在最后

好了,以上就是StringBuilder类的介绍,和StringBuilder有类似功能的类叫做 StringBuffer类,它和StringBuilder的区别就是StringBuilder类不支持多线程,速度更快,所以大多数情况下优先使用StringBuilder,而StringBuffer类支持多线程,更加安全。大家可以查看API文档了解一下。

以上内容如有不正之处,欢迎掘友们批评指正。