StringBuffer类
在Java中,由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串进行修改,在JDK中提供了一个StringBuffer类(也称字符串缓冲区)来操作字符串。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的StringBuffer对象。
针对添加和删除字符的操作,StringBuffer类提供了一系列的方法,如表1所示。
表1 StringBuffer类常用方法
方法声明 | 功能描述 |
---|---|
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 |
void setCharAt(int index, char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
在表1中,列出了StringBuffer类的一系列常用方法,对于初学者来说比较难以理解。接下来通过一个案例来学习一下表中方法的具体使用,如文件1所示。
文件1 Example08.java
1 public class Example08 {
2 public static void main(String[] args) {
3 System.out.println("1、添加------------------------");
4 add();
5 System.out.println("2、修改------------------------");
6 update();
7 System.out.println("3、删除------------------------");
8 delete();
9 }
10 // 添加
11 public static void add() {
12 StringBuffer sb = new StringBuffer(); // 定义一个字符串缓冲区
13 sb.append("ABC"); // 添加字符串
14 System.out.println("append添加结果:" + sb);
15 sb.insert(3, "DE"); // 在指定位置插入字符串
16 System.out.println("insert添加结果:" + sb);
17 }
18 // 修改
19 public static void update() {
20 StringBuffer sb = new StringBuffer("ABAAA");
21 sb.setCharAt(2, 'C'); // 修改指定位置字符
22 System.out.println("修改指定位置字符结果:" + sb);
23 sb.replace(3, 5, "DE"); // 替换指定位置字符串或字符
24 System.out.println("替换指定位置字符(串)结果:" + sb);
25 System.out.println("字符串翻转结果:" + sb.reverse());
26 }
27 // 删除
28 public static void delete() {
29 StringBuffer sb = new StringBuffer("ABCDEFG");
30 sb.delete(3, 7); // 指定范围删除
31 System.out.println("删除指定位置结果:" + sb);
32 sb.deleteCharAt(2); // 指定位置删除
33 System.out.println("删除指定位置结果:" + sb);
34 sb.delete(0, sb.length()); // 清空缓冲区
35 System.out.println("清空缓冲区结果:" + sb);
36 }
37 }
运行结果如图1所示。
图1 运行结果
在文件1中涉及到StringBuffer类的很多方法,其中append()和insert()方法是最常用的,并且这两个方法有很多重载形式,它们都用于添加字符。不同的是,append()方法始终将这些字符添加到缓冲区的末尾,而insert()方法则可以在指定的位置添加字符。另外, StringBuffer对象的delete()方法用于删除指定位置的字符,包含起始索引,不包含结束索引,setCharAt()和replace()方法用于替换指定位置的字符。
StringBuffer类和String类有很多相似之处,初学者在使用时很容易混淆。接下来针对这两个类进行对比,简单归纳一下两者的不同,具体如下:
①String类定义的字符串是常量,一旦创建后,内容和长度都是无法改变的。StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。
②String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。具体示例如下:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2)); // 打印结果为true
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1.equals(sb2)); // 打印结果为false
③String类对象可以用操作符“+”进行连接,而StringBuffer对象之间不能,具体示例如下:
String s1 = "a";
String s2 = "b";
String s3 = s1+s2; // 合法
System.out.println(s3); // 打印输出 ab
StringBuffer sb1 = new StringBuffer("a");
StringBuffer sb2 = new StringBuffer("b");
StringBuffer sb3 = sb1 + sb2; // 编译出错
多学一招:StringBuilder的使用
除了使用StringBuffer外,JDK 1.5之后提供了一个StringBuilder类同样可以操作字符串。StringBuilder与StringBuffer的功能相似,且两个类中所提供的方法也基本相同。二者所不同的是StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对象,应该优先考虑StringBuilder类。
StringBuilder类同样提供了一系列的追加(append)、插入(insert)、替换(replace)和删除(delete)的方法。如果将文件1中的StringBuffer换成StringBuilder,程序同样可以正确执行。