一、基础接口/类
1. CharSequence
CharSequence是一个接口,表示char值的一个可读序列。此接口对不同种类的char序列提供统一的只读访问接口。
此接口不修改equals和hashCode方法。
实现类:CharBuffer、String、StringBuilder、StringBuffer
charAt(int): char //访问
subSequence(int, int): CharSequence //返回子CharSequence
toString(): String
length(): int
2. Appenable
Appenable是一个接口,表示可添加char序列和值。
实现类:StringBuffer、 StringBuilder、BufferedWriter、CharArrayWriter、CharBuffer、 FileWriter等等。
append(CharSequence): Appendable
append(CharSequence, int, int): Appendable
append(char): Appendable
3. AbstractStringBuilder
AbstractStringBuilder是一个抽象类,表示可变的字符序列。
实现了CharSequence和Appenable接口。
数据结构
使用char[]保存当前字符序列,使用int保存当前字符数量。
API
实现了基础的修改字符序列方法。子类仅需实现toString方法。
@Override
public abstract String toString();
二、String
实现了CharSequence接口,为可访问的char序列。
实现了Serializable接口,可以被序列化。
实现了Comparable<String>,支持String之间的相互比较。
1. 数据结构
为字符数组char[],存储字符的unicode值。
2. 特点
-
不可变
一旦生成,char[]中数据就不可变。即String内容不变。
-
重复利用
当新创建String test = "abc"时,JVM会到String常量池查询是否已经存在内容为“abc”的String对象,如果已经存在该String,则把test设置为这个对象的引用;如果不存在,则新创建一个内容为“abc”的String对象,并加入常量池。
三、StringBuilder
继承自AbstractStringBuilder,实现了Serializable、CharSequence接口。
1. 数据结构
使用父类AbstractStringBuilder中的字符数组。
2. 特点
- 可变
- 非线程安全
- 仅在toString()时生成String对象
3. 实现
实现toString方法。使用StringFactory根据字符数组char[]生成一个新的String对象并返回。
@Override
public String toString() {
if (count == 0) {
return "";
}
return StringFactory.newStringFromChars(0, count, value);
}
四、 StringBuffer
继承自AbstractStringBuilder,实现了Serializable、CharSequence接口。
1. 数据结构
使用父类AbstractStringBuilder中的字符数组。
2. 特点
- 线程安全
- 仅在toString()时生成String对象且在不修改内容的情况下只生成一次。
3. 实现
实现线程安全
public方法添加synchronized同步锁。
实现toString方法
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, 0, count);
}
五、总结
1.整体框架图
2. 比较
是否可变 | 是否线程安全 | |
---|---|---|
String | 否 | 是 |
StringBuilder | 是 | 否 |
StringBuffer | 是 | 是 |
3.使用场景
可以根据是否需要内容可变/是否运行在多线程环境下,来选择合适的类。