StringBuilder与StringBuffer
在需要进行频繁的字符串拼接,删除操作时,如果使用String对象,则每一次改变字符串内容都会创建一个新的String对象,十分耗费内存。这时候我们可以使用
StringBuilder类
或StringBuffer类
,不用创建新的对象,提高性能,加快速度
StringBuilder类
一个可变的字符序列。 该类
不能保证同步
。 该类被设计为在字符串缓冲区被单个线程使用的地方(作为一般情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer
因为它在大多数实施中将更快。
构造方法
构造方法 | 描述 |
---|---|
StringBuilder () | 构造一个没有字符的字符串构建器,初始容量为16个字符 |
StringBuilder (int capacity) | 构造一个没有字符的字符串构建器,以及由 capacity 参数指定的初始容量 |
StringBuilder (CharSequence seq) | 构造一个字符串构建器,其中包含与指定的 CharSequence 相同的字符 |
StringBuilder (String str) | 构造一个初始化为指定字符串内容的字符串构建器 |
每个字符串构建器都具有容量。只要字符串构建器中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。如果内部缓冲区溢出,则会自动变大。
StringBuilder类有两个改变内部缓冲区大小的方法
void ensureCapacity(int minimumCapacity)
void trimToSize()
它们调用StringBuilder继承的抽象类AbstractStringBuilder
的方法
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
public void trimToSize() {
if (count < value.length) {
value = Arrays.copyOf(value, count);
}
}
缓冲区大小调整通过它实现的char数组进行复制操作,转移到更大的数组中从而扩容
常用方法
StringBuilder append (object):将object添加到序列后
object可以是boolean,char,int,long,double,String基本类型,也可以是char[]数组,Object对象,StringBuffer对象等
StringBuilder delete (int start,int end):删除序列中start到end索引的子串
StringBuilder deleteCharAt (int index):删除指定索引的字符
StringBuilder insert (int offset,object):在offset索引开始插入object
object可以是boolean,char,int,long,float,double,String,char[]数组,Object对象
StringBuilder indexOf (String str):返回str串首次在序列中出现的索引
StringBuilder lastIndexOf (String str):返回str串最后一次在序列中出现的索引
StringBuilder reverse ():序列反转
StringBuilder setCharAt (int index,char c):替换索引的字符为c
String subSequence (int start,int end):截取指定索引间的子串
String toString ():返回此序列的字符串
区别
StringBuilder
实例不能安全使用多线程。 如果需要同步,那么建议使用StringBuffer
。
通常应该使用StringBuilder
类,因为它支持所有相同的操作,但它更快,因为它不执行同步。