String类功能非常强大,但String类是不可变的,一旦定义其值就是不可变的,这样就会对内存空间造成浪费,JAVA就开发了一个全新的类StringBuffer类,字符串缓冲区。线程安全的可变字符序列,用于提高字符串的操作效率。
内部采用了可变数组的方式来实现的,类的内部定义了数组,此数组不是final修饰的。
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializeable,Charsequence{
super(16); //父类构造器,创建了一个16个字符的char数组
}
继承自父类AbstractStringBuilder
abstract class AbstractStringBuilder{
char[] value;
//构造器
ABstractStringBuilder(int capacity){
value = new char[capacity];
}
}
//数组是可变的,默认容量是16个字符
StringBuffer无论怎么操作,内部只会有一个char[]数组,而String会产生多个不可变的char[]数组。
StringBuffer的构造方法
1. 空参构造方法,构造一个不带字符的缓冲区,初始容量为16个字符
StringBuffer(); -->super(16);
2. StringBuffer(CharSequence seq);构造一个字符串缓冲区,包含与指定的CharSequence(字符序列)相同的字符。
该缓冲区初始容量为16加上CharSequence参数的长度,如果CharSequence的长度小区或等于0,则返回16个字符长度的空缓冲区
3. StringBuffer(String str); 构造一个字符串缓冲区,包含传入的str字符串,其长度为16+str.length(), 传null会报错nullPointerException
4. StringBuffer(int capacity); 构造一个不带字符,但具有capacity容量的字符串缓冲区,capacity不能为负数。
StringBuffer的方法
1. append(参数); 向StringBuffer对象后追加任意类型的数据,返回StringBuffer。它有多个重载方法,可以追加int string char object array等
StringBuffer buffer = new StringBuffer();
buffer.append(89);
2. capacity(); 返回int capacity,即缓冲区的容量大小
StringBuffer buffer = new StringBuffer("abc");
buffer.capacity();
返回19; 原本16的容量加上字符串长度
3. charAt(int index); 返回缓冲区指定索引处的char字符
StringBuffer buffer = new StringBuffer("abc");
如果要取得'b',则:buffer.charAt(1);
注意:StringBuffer的容量和长度概念,长度指实际存在的字符长度,容量指的是可以装的字符个数。
故StringBuffer("abc");容量为19,但长度为3,这个一定要弄清楚。否则在使用charAt的时候,一不小心就会越界。
4. delete(int start,int end);移除此缓冲区指定范围中的字符,包头不包尾。返回StringBuffer
StringBuffer buffer = new StringBuffer("abcdef");
buffer.delete(1,5); abcdef
结果:af
将缓冲区所有字符全删除 :buffer.delete(0,buffer.length());
5. insert(int index,任意参数数据); 将任意类型数据插入到缓冲区指定位置
StringBuffer buffer = new StringBuffer("abcdef");
buffer.insert(3,9.5);
结果是:abc9.5def //将9.5放到3索引上
6. replace(int start,int end,string str); 将指定范围内的内容替换为指定的字符串,不包含尾
7. reverse(); 翻转缓冲区字符。
StringBuffer = new StringBuffer("abcd");
buffer.reverse()'
结果:dcba
8. toString(); 将缓冲区中的所有字符变成字符串,继承自Object并重写。返回值为String对象
StringBuilder与StringBuffer用法完全一样
StringBuffer为线程安全的序列,多线程安全
StringBuilder如果被单线程使用的时候,建议优先使用StringBuilder,速度要快很多