1.分析 StringBuffer 的底层源码
它是JDK1.0引进来的,它继承于AbstractStringBuilder
再看看它的父类AbstractStringBuilder的源码:
alue: 用于存储字符,可以看到value没有用final修饰,表明它可以进行不断地扩容;
int count:计数是使用的有效字符数
2. StringBuffer 详述
StringBuffer 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。
如果内部缓冲区溢出,则会自动变大。除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException 。
从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。 StringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。
3.StringBuffer 的构造方法
StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer(CharSequence seq) 构造一个包含与指定的相同字符的字符串缓冲区 CharSequence 。
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
4. StringBuffer 的常用方法
int length() 返回长度(字符数)
char charAt(int index) 返回 char在指定索引在这个序列值
int indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引
String substring(int start) 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
StringBuffer append(xxx) 提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start, int end) 删除此序列的子字符串中的字符
StringBuffer replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 String
StringBuffer insert(int offset, xxx) 在指定位置插入xxx
StringBuffer reverse() 把当前字符序列逆转
测试代码:
测试结果:
二、聊聊 StringBuilder
从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。 StringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。
StringBuilder的常用方法与StringBuffer的相同,这里不再详述。
三、两者 与 String 的区别
String 由final修饰,是不可变字符序列
StringBuffer 可变字符序列,其效率低,但是线程安全
StringBuilder 可变字符序列,其效率高,但是线程不安全