一、概要:
线程安全的可变字符序列。可以通过调用一些方法来改变StringBuilder的长度和内容。里面的每个方法都被synchronized 关键字修饰。
字符串缓冲区可安全用于多个线程。这些方法在必要时进行同步,以使任何特定实例上的所有操作都表现为好像以某种串行顺序发生,该顺序与所涉及的每个单独线程进行的方法调用的顺序一致。
从JDK5开始,java添加了一个等效类StringBuilder,该类用户单个线程,不执行同步,线程不安全,这样执行相同的操作时StringBuilder更快。
每当发生涉及源序列的操作(例如从源序列追加或插入)时,此类仅在执行作的字符串缓冲区上同步,而不在源上同步
二、实现接口和继承类:
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
实现序列化接口。在序列化接口中并没有任何属性和方法,就用于表示
可序列化的VO类如果没有实现序列化,Java类的属性值会在程序执行
完毕之后被释放,这样就不能将这个类进行网络传输,为了能够在以后
取出这个对象来使用、传输和保存,可以实现序列化接口,将对象写入
内存,变成可存储可传输的状态,需要使用的时候就可以进行反序列
化,就是重新生成相同的对象实例。实现序列化在项目VO类中经常使
用到,如果没有实现会报错误实现CharSequence接口。
继承AbstractStringBuilder类。
三、变量:
//toString返回的最后一个值的缓存。每当修改StringBuffer时清除。
private transient char[] toStringCache;
//序列化ID在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本
//地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以
//进行反序列化,否则就会报序列化版本不一致的异常
static final long serialVersionUID = 3388685877147921107L;
四、构造器
// 初始容量为16
public StringBuffer() {
super(16);
}
//指定容量
public StringBuffer(int capacity) {
super(capacity);
}
//构造一个初始化为指定字符串内容的字符串,容量为字符串参数长度加上16
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
继承CharSequence的方法
//返回字符串的长度
@Override
public synchronized int length() {
return count;
}
//返回当前字符串的容量
@Override
public synchronized int capacity() {
return value.length;
}
//返回指定位置的字符
@Override
public synchronized char charAt(int index) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
return value[index];
}
继承AbstractStringBuilder
//修改容量
@Override
public synchronized void setLength(int newLength) {
toStringCache = null;
super.setLength(newLength);
}
//等价与将容量改为与当前字符串长度相等的值
@Override
public synchronized void trimToSize() {
super.trimToSize();
}
//还有各种append
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//将原字符的start开始到end结束的字符替换为参数str
@Override
public synchronized StringBuffer replace(int start, int end, String str) {
toStringCache = null;
super.replace(start, end, str);
return this;
}
//返回从start开始到尾部的字符串
@Override
public synchronized String substring(int start) {
return substring(start, count);
}
//将字符串插入指定位置
@Override
public synchronized StringBuffer insert(int offset, String str) {
toStringCache = null;
super.insert(offset, str);
return this;
}
//返回首次出现str的下标
@Override
public int indexOf(String str) {
// Note, synchronization achieved via invocations of other StringBuffer methods
return super.indexOf(str);
}
//反转字符串
@Override
public synchronized StringBuffer reverse() {
toStringCache = null;
super.reverse();
return this;
}