学科分类
目录
Java基础

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,程序同样可以正确执行。

点击此处
隐藏目录