StringBuffer类
在上一节我们知道 String 字符串是常量,字符串的值在创建之后不能更改。我们平时“改变”字符串值的方式,其实是先产生新的字符串,然后将原引用指向新的字符串,这样看起来就像改变了字符串一样。显然,如果需要频繁修改字符串的值,使用 String 就显得低效了。是否存在一个类,既可以存储字符串,又能对这个字符串自身进行修改而尽量少地产生新字符串呢?可以,这个类就是 StringBuffer。StringBuffer 字符串代表的是可变的字符序列,可以对字符串对象的内容进行修改。
以下是 StringBuffer 类最常用的构造方法。
- StringBuffer():构造一个空白的字符串缓冲区,其初始容量为 16 个字符。
- StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
我们可以通过 StringBuffer 类的构造方法创建 StringBuffer 字符串的代码。
StringBuffer strB1 = new StringBuffer();
System.out.println(strB1.length());
以上通过 strB1.length()返回的字符串长度是 0。但实际上,strB1 的底层创建了一个长度为 16 的字符数组,为接收字符串内容做准备。
StringBuffer strB2 = new StringBuffer("柳海龙");
System.out.println(strB2.length());
通过strB2.length()返回长度是 3,实际在底层创建了一个长度为 3+16 的字符数组。
StringBuffer 上的主要操作是 append 和 insert 方法,将字符追加或插入到字符串缓冲区中。append 方法始终将字符添加到缓冲区的末端,而 insert 方法则在指定的位置添加字符。
StringBuffer类的常用方法
以下是 StringBuffer 类的常用方法:
1. public StringBuffer append(String str)
将 str 指定的字符串追加到此字符序列的末尾。
2. public StringBuffer append(StringBuffer str)
将 str 指定的 StringBuffer 字符串追加到此序列的末尾。
3. public StringBuffer append(char[] str)
将 str 指定的字符数组追加到此序列的末尾。
4. public StringBuffer append(char[] str,int offset,int len)
自索引 offset 开始截取 str 的 len 个字符追加到此序列中。
5. public StringBuffer append(double d)
将 double 类型的变量 d 的字符串表示形式追加到此序列的末尾。
6. public StringBuffer append(Object obj)
将参数 obj 的字符串表示形式追加到此序列的末尾。
7. public StringBuffer insert(int offset,String str)
将字符串 str 插入到此字符序列中,offset 表示插入位置。
StringBuffer测试题
StringBuilder类
除了 StringBuffer 以外,还存在另一个可变的字符串类 StringBuilder。
StringBuilder 类是在 Java 5.0 中被提出的,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法是非线程安全的,而 StringBuffer 是线程安全的(“线程安全”会在后续章节学习)。
对于我们初学者而言,非线程安全意味着速度更快,因此在目前阶段建议使用 StringBuilder 类;等以后大家学习了高并发相关内容以后,再根据情况考虑使用 StringBuffer。
StringBuffer 是一个内容可变的字符序列,或者说它是一个内容可变的字符串类型。当使用 StringBuffer strB1 = new StringBuffer(“柳海龙”); 语句创建 StringBuffer 对象时,内存结构示意图如图所示。
当使用 strB1.append(“工程师”) 方法时,将之前创建的 StringBuffer 对象的内容“柳海龙”修改成“柳海龙工程师”,内存结构示意图如图所示。