1.介绍
StringBuilder 是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。底层是字符数组,与 String 不同的是该字符数组未被 final 修饰,所以可以修改。
public final class StringBuilder
extends AbstractStringBuilder
implements Serializable, CharSequence
{}
abstract class AbstractStringBuilder
implements Appendable, CharSequence {
char[] value;
int count;
}
2.初始化
2.1 使用
| 方法 | 描述 |
|---|
| public StringBuilder() | 无参构造函数 |
| public StringBuilder(int capacity) | 入参为容量的构造函数 |
| public StringBuilder(String str) | 入参为字符串的构造函数 |
| public StringBuilder(CharSequence seq) | 入参为 CharSequence 的构造函数 |
StringBuilder builder = new StringBuilder();
StringBuilder builder1 = new StringBuilder(12);
StringBuilder builder2 = new StringBuilder("ab");
StringBuilder builder3 = new StringBuilder(builder2);
2.2 源码简析
public StringBuilder() {
super(16);
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
public StringBuilder(int capacity) {
super(capacity);
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
3.尾部添加元素
3.1 使用
| 方法 | 描述 |
|---|
| public StringBuilder append(Object obj) | 添加 Object 元素 |
| public StringBuilder append(String str) | 添加 String 元素 |
| public StringBuilder append(StringBuffer sb) | 添加 StringBuffer 元素 |
| public StringBuilder append(CharSequence s) | 添加 CharSequence 元素 |
| public StringBuilder append(CharSequence s, int start, int end) | 添加指定范围的 CharSequence 元素 |
| public StringBuilder append(char[] str) | 添加 char[] 元素 |
| public StringBuilder append(char[] str, int offset, int len) | 添加指定范围的 char[] 元素 |
| public StringBuilder append(boolean b) | 添加 boolean 元素 |
| public StringBuilder append(char c) | 添加 char 元素 |
| public StringBuilder append(int i) | 添加 int 元素 |
| public StringBuilder append(long lng) | 添加 long 元素 |
| public StringBuilder append(float f) | 添加 float 元素 |
| public StringBuilder append(double d) | 添加 double 元素 |
StringBuilder builder = new StringBuilder();
builder.append("a").append(2).append('b');
StringBuilder builder2 = new StringBuilder();
builder2.append(new char[]{'a','b','c','d','e','f'},1,2);
3.2 源码简述
3.2.1 入口函数
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;
}
public AbstractStringBuilder append(char str[], int offset, int len) {
if (len > 0)
ensureCapacityInternal(count + len);
System.arraycopy(str, offset, value, count, len);
count += len;
return this;
}
3.2.2 扩容操作
private void ensureCapacityInternal(int minimumCapacity) {
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
private int newCapacity(int minCapacity) {
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
private int hugeCapacity(int minCapacity) {
if (Integer.MAX_VALUE - minCapacity < 0) {
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE)
? minCapacity : MAX_ARRAY_SIZE;
}
3.2.3 填充元素
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);
}
4.指定位置插入元素
4.1 使用
| 方法 | 描述 |
|---|
| public StringBuilder insert(int index, char[] str, int offset, int len) | 在指定位置插入 str[offset,offet+len-1] |
| public StringBuilder insert(int offset, Object obj) | 在指定位置插入 Object 元素 |
| public StringBuilder insert(int offset, String str) | 在指定位置插入 String 元素 |
| public StringBuilder insert(int offset, char[] str) | 在指定位置插入 char[] 元素 |
| public StringBuilder insert(int dstOffset, CharSequence s) | 在指定位置插入 CharSequence 元素 |
| public StringBuilder insert(int dstOffset, CharSequence s, int start, int end) | 在指定位置插入 CharSequence[start,end) 元素 |
| public StringBuilder insert(int offset, boolean b) | 在指定位置插入 boolean 元素 |
| public StringBuilder insert(int offset, char c) | 在指定位置插入 char 元素 |
| public StringBuilder insert(int offset, int i) | 在指定位置插入 int 元素 |
| public StringBuilder insert(int offset, long l) | 在指定位置插入 long 元素 |
| public StringBuilder insert(int offset, float f) | 在指定位置插入 float 元素 |
| public StringBuilder insert(int offset, double d) | 在指定位置插入 double 元素 |
StringBuilder builder = new StringBuilder("abcdef");
builder.insert(1,"12");
StringBuilder builder2 = new StringBuilder("abcdef");
builder2.insert(1,new char[]{'0','1','2','3','4','5','6'},1,2);
StringBuilder builder3 = new StringBuilder("abcdef");
builder3.insert(1,"0123456",1,3);
4.2 源码简述
4.2.1 情况1

public AbstractStringBuilder insert(int offset, String str) {
if ((offset < 0) || (offset > length()))
throw new StringIndexOutOfBoundsException(offset);
if (str == null)
str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
System.arraycopy(value, offset, value, offset + len, count - offset);
str.getChars(value, offset);
count += len;
return this;
}
4.2.2 情况2

public AbstractStringBuilder insert(int index, char[] str, int offset, int len)
{
if ((index < 0) || (index > length()))
throw new StringIndexOutOfBoundsException(index);
if ((offset < 0) || (len < 0) || (offset > str.length - len))
throw new StringIndexOutOfBoundsException(
"offset " + offset + ", len " + len + ", str.length "
+ str.length);
ensureCapacityInternal(count + len);
System.arraycopy(value, index, value, index + len, count - index);
System.arraycopy(str, offset, value, index, len);
count += len;
return this;
}
4.2.3 情况3

public AbstractStringBuilder insert(int dstOffset, CharSequence s, int start, int end) {
if (s == null)
s = "null";
if ((dstOffset < 0) || (dstOffset > this.length()))
throw new IndexOutOfBoundsException("dstOffset "+dstOffset);
if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))
throw new IndexOutOfBoundsException(
"start " + start + ", end " + end + ", s.length() "
+ s.length());
int len = end - start;
ensureCapacityInternal(count + len);
System.arraycopy(value, dstOffset, value, dstOffset + len, count - dstOffset);
for (int i=start; i<end; i++)
value[dstOffset++] = s.charAt(i);
count += len;
return this;
}
5.toString()
5.1 源码简述
StringBuilder 是字符数组,转换为字符串是使用 String 的构造函数传递数组进行转换。
public String toString() {
return new String(value, 0, count);
}