死磕Jdk源码之StringBuilder:

本博客目前所有 死磕 Jdk 源码系列都是使用 jdk1.8版本。

简介

  • StringBuilder继承自AbstractStringBuilder
  • StringBuilder实现了CharSequence接口,表示为一个字符序列
  • StringBuilder实现了Appendable接口,表示为可追加的字符序列,可以理解为可变的字符串

事实上StringStringBuilder以及StringBuffer都是字符序列,都实现了CharSequence接口,都是在内部维护一个char类型的数组。

StringBufferStringBuilder的类结构完全相同,唯一的区别就是StringBuffer的方法使用了synchronized关键字,是线程安全的。

String类同样实现了CharSequence接口,同时StringStringBuffer以及StringBuilder都是final类型,不允许被继承。String内部维护的字符数组是不可变的。

特性

数据结构

StringBuilder内部维护一个字符数组,默认大小为16,通过append方法追加字符时,会调用AbstractStringBuilderensureCapacityInternal方法检查数组是否需要扩容。从而实现可变的字符串。

成员变量/常量

StringBuilder以及StringBuffer都继承自AbstractStringBuilder,它们的核心功能也都来自AbstractStringBuilder

继承自AbstractStringBuilder的成员变量

  • value 用于存储字符的char数组

  • count 当前的字符数量,因为字符数组中可能留有缓冲,所以字符大小可能小于数组大小

死磕源码

构造函数

默认无参构造函数,直接调用父类构造器,创建一个长度为 16 的字符数组。

1
2
3
public StringBuilder() {
super(16);
}

父类AbstractStringBuilder构造器

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

通过给定的容量大小构建StringBuilder

1
2
3
public StringBuilder(int capacity) {
super(capacity);
}

通过字符串构建StringBuilder

1
2
3
4
5
public StringBuilder(String str) {
// 预留 16 位的缓冲区
super(str.length() + 16);
append(str);
}

通过字符序列构建StringBuilder

1
2
3
4
5
public StringBuilder(CharSequence seq) {
// 预留 16 位的缓冲区
this(seq.length() + 16);
append(seq);
}

总结

使用不可变的字符串可以使用String,使用可变类型字符串可以使用StringBufferStringBuilder,如果需要考虑线程安全,可以使用StringBuffer