一、前言
StringBuilder
是可变字符串序列,API和StringBuffer兼容。StringBuilder
不保证线程安全,而StringBuffer可以。
由于单线程没有线程同步的要求,所以StringBuilder
在单线程中比StringBuffer
拥有更好的性能。同样道理,多线程中应该使用StringBuffer
保证字符串修改的安全。
二、类签名
StringBuilder
继承AbstractStringBuilder
,实现了Serializable
和CharSequence
接口。构造方法、字符串增删查改在AbstractStringBuilder
父类中实现,StringBuilder
只负责调用父类方法。
1
2
3
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
StringBuffer
同样继承自AbstractStringBuilder
,调用方法时增加了synchronized
同步锁。这是StringBuilder
和StringBuffer
在API互相兼容、线程安全存在差异的原因。
由此阅读AbstractStringBuilder才能了解可变字符串如何实现,仅看StringBuffer
和StringBuilder
没有太大帮助。
三、构造方法
可通过字符串长度、默认构造方法,或字符串作为参数创建StringBuilder。默认构造方法的字符串长度是16,自定义字符串则会在指定长度上加16作为缓冲长度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public StringBuilder() {
super(16);
}
public StringBuilder(int capacity) {
super(capacity);
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
四、方法
4.1 添加
尾添加对象,准确来说是obj.toString()或“null”
1
2
3
4
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
尾添加字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
// 越界异常
@Override
public StringBuilder append(CharSequence s, int start, int end) {
super.append(s, start, end);
return this;
}
@Override
public StringBuilder append(char[] str) {
super.append(str);
return this;
}
// 越界异常
@Override
public StringBuilder append(char[] str, int offset, int len) {
super.append(str, offset, len);
return this;
}
尾添加布尔值,true
或false
的字符串
1
2
3
4
5
@Override
public StringBuilder append(boolean b) {
super.append(b);
return this;
}
加入一个字符
1
2
3
4
5
@Override
public StringBuilder append(char c) {
super.append(c);
return this;
}
尾添加数值,byte
和short
类型提升到int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public StringBuilder append(int i) {
super.append(i);
return this;
}
@Override
public StringBuilder append(long lng) {
super.append(lng);
return this;
}
@Override
public StringBuilder append(float f) {
super.append(f);
return this;
}
@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
尾添加字符编码对应字符
1
2
3
4
5
@Override
public StringBuilder appendCodePoint(int codePoint) {
super.appendCodePoint(codePoint);
return this;
}
4.2 删除
删除指定下标或范围的字符,可能抛出StringIndexOutOfBoundsException
异常
1
2
3
4
5
6
7
8
9
10
11
@Override
public StringBuilder delete(int start, int end) {
super.delete(start, end);
return this;
}
@Override
public StringBuilder deleteCharAt(int index) {
super.deleteCharAt(index);
return this;
}
4.3 替换
替换字符串
1
2
3
4
5
@Override
public StringBuilder replace(int start, int end, String str) {
super.replace(start, end, str);
return this;
}
4.4 插入
插入字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@Override
public StringBuilder insert(int index, char[] str, int offset, int len) {
super.insert(index, str, offset, len);
return this;
}
@Override
public StringBuilder insert(int offset, Object obj) {
super.insert(offset, obj);
return this;
}
@Override
public StringBuilder insert(int offset, String str) {
super.insert(offset, str);
return this;
}
@Override
public StringBuilder insert(int offset, char[] str) {
super.insert(offset, str);
return this;
}
@Override
public StringBuilder insert(int dstOffset, CharSequence s) {
super.insert(dstOffset, s);
return this;
}
@Override
public StringBuilder insert(int dstOffset, CharSequence s,
int start, int end)
{
super.insert(dstOffset, s, start, end);
return this;
}
@Override
public StringBuilder insert(int offset, boolean b) {
super.insert(offset, b);
return this;
}
@Override
public StringBuilder insert(int offset, char c) {
super.insert(offset, c);
return this;
}
@Override
public StringBuilder insert(int offset, int i) {
super.insert(offset, i);
return this;
}
@Override
public StringBuilder insert(int offset, long l) {
super.insert(offset, l);
return this;
}
@Override
public StringBuilder insert(int offset, float f) {
super.insert(offset, f);
return this;
}
@Override
public StringBuilder insert(int offset, double d) {
super.insert(offset, d);
return this;
}
4.5 查找
查找字符在字符串中的序号,可以指定字符串开始下标
1
2
3
4
5
6
7
8
9
@Override
public int indexOf(String str) {
return super.indexOf(str);
}
@Override
public int indexOf(String str, int fromIndex) {
return super.indexOf(str, fromIndex);
}
最后一次出现的下标
1
2
3
4
5
6
7
8
9
@Override
public int lastIndexOf(String str) {
return super.lastIndexOf(str);
}
@Override
public int lastIndexOf(String str, int fromIndex) {
return super.lastIndexOf(str, fromIndex);
}
4.6 翻转
翻转字符串
1
2
3
4
5
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
4.7 toString
返回字符串拷贝,而不是字符串数组本身
1
2
3
4
@Override
public String toString() {
return new String(value, 0, count);
}