StringBuffer 类和 StringBuilder 方法
前面学到过 String 类有一个重要的特点,那就是 String 的值是不可变的,这就导致每次对 String 的操作都会生成新的 String 对象,不仅效率低下,而且大量浪费有限的内存空间。那么对于经常要改变值的字符串应该怎样操作呢?
答案就是使用 StringBuffer 和 StringBuilder 类,这两个类功能基本相似,区别主要在于 StringBuffer 类的方法是多线程安全的(多线程的课程在后面会学习到),而StringBuilder 不是线程安全的,相比而言 StringBuilder 类会略微快一点。
StringBuffer 类
类 String
–字符串(String)对象一旦创建,其内容不能再被修改 (read-only)
类 StringBuffer
–StringBuffer 对象的内容是可以被修改的
–除了字符的长度之外,还有容量的概念
–通过动态改变容量的大小,加速字符管理
1:StringBuffer 的构造方法
buf1 = new StringBuffer();
–创建空的 StringBuffer 对象,初始容量为 16 字符
buf2 = new StringBuffer( 容量 );
–创建空的 StringBuffer 对象,指定容量大小。
buf3 = new StringBuffer( myString );
–创建含有相应字符序列的 StringBuffer 对象,容量为 myString.length() +
–实例:
StringBuffer b = new StringBuffer("hello");
2:StringBuffer 的常用方法
•方法 length()
–返回 StringBuffer 的长度
•方法 capacity()
–返回 StringBuffer 的容量
•方法 setLength(int newLength)
–增加或减小 StringBuffer 的长度
•方法 charAt(int index)
–返回 StringBuffer 对象中指定位置的字符
•方法 setCharAt(int index, char ch)
–设置 StringBuffer 对象中指定位置的字符
•方法 getChars(int srcBegin, int srcEnd,
Char[] dst, int dstBegin)
–将 StringBuffer 对象中指定的字符子序列,拷贝到指定的字符数组(dst)
•方法 reverse()
–将 StringBuffer 对象中的字符序列按逆序方式排列,可用作字符串倒序
•11 种 append(…) 方法
–允许数值类型的值添加到 StringBuffer 对象中
•10 种 insert 方法
–允许将各种数据插到 StringBuffer 对象的指定位置
•方法 delete(int start, int end) 和 deleteCharAt(int index)
–允许删除 StringBuffer 对象中的指定字符
其中最常用的恐怕就要算 append 方法和 toString 方法了
源代码
public class UsingStringBuffer {
public static void main(String[] args) {
UsingStringBuffer us = new UsingStringBuffer();
// us.testFindStr();
// us.testSubStr();
// us.testCharAtStr();
// us.testAppend();
// us.testDelete();
// us.testInsert();
// us.testReplace();
us.reverseStr();
}
/**
* 查找匹配字符串
*/
public static void testFindStr() {
StringBuffer sb = new StringBuffer();
sb.append("This is a StringBuffer");
// 返回子字符串在字符串中最先出现的位置,如果不存在,返回负数
System.out.println("sb.indexOf(\"is\")=" + sb.indexOf("is"));
// 给indexOf方法设置参数,指定匹配的起始位置
System.out.println("sb.indexOf(\"is\")=" + sb.indexOf("is", 3));
// 返回子字符串在字符串中最后出现的位置,如果不存在,返回负数
System.out.println("sb.lastIndexOf(\"is\") = " + sb.lastIndexOf("is"));
// 给lastIndexOf方法设置参数,指定匹配的结束位置 ,从指定位置开始,从后往前
System.out.println("sb.lastIndexOf(\"is\", 1) = "
+ sb.lastIndexOf("is", 1));
}
/**
* 截取字符串
*/
public static void testSubStr() {
StringBuffer sb = new StringBuffer();
sb.append("This is a StringBuffer");
// 默认的终止位置为字符串的末尾
System.out.print("sb.substring(4)=" + sb.substring(4));
// substring方法截取字符串,可以指定截取的起始位置和终止位置
System.out.print("sb.substring(4,9)=" + sb.substring(4, 9));
}
/**
* 获取字符串中某个位置的字符
*/
public static void testCharAtStr() {
StringBuffer sb = new StringBuffer("This is a StringBuffer");
System.out.println(sb.charAt(sb.length() - 1));
}
/**
* 添加各种类型的数据到字符串的尾部
*/
public static void testAppend() {
StringBuffer sb = new StringBuffer("This is a StringBuffer!");
sb.append(1.23f);
sb.append("hello");
System.out.println(sb.toString());
}
/**
* 删除字符串中的数据
*/
public static void testDelete() {
StringBuffer sb = new StringBuffer("This is a StringBuffer!");
sb.delete(0, 5);
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb.toString());
}
/**
* 向字符串中插入各种类型的数据
*/
public static void testInsert() {
StringBuffer sb = new StringBuffer("This is a StringBuffer!");
// 能够在指定位置插入字符、字符数组、字符串以及各种数字和布尔值
sb.insert(2, 'W');
sb.insert(3, new char[] { 'A', 'B', 'C' });
sb.insert(8, "abc");
System.out.println("testInsert: " + sb.toString());
}
/**
* 替换字符串中的某些字符
*/
public static void testReplace() {
StringBuffer sb = new StringBuffer("This is a StringBuffer!");
// 将字符串中某段字符替换成另一个字符串
sb.replace(10, sb.length(), "Integer");
System.out.println("testReplace: " + sb.toString());
}
/**
* 将字符串倒序
*/
public static void reverseStr() {
StringBuffer sb = new StringBuffer("This is a StringBuffer!");
System.out.println(sb.reverse()); // reverse方法将字符串倒序
}
}