当需要对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不会产生新的未使用的对象。在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改的话,推荐使用 StringBuffer。StringBuilder 类和 StringBuffer 类之间的最大不同在于 StringBuilder 的方法不是线程安全的,即不能同步访问。由于 StringBuilder 相较于 StringBuffer 有速度上的优势,所以多数情况下还是建议使用 StringBuilder 类。但是如果应用程序要求线程安全时,则必须使用 StringBuffer 类。
方法 | 返回值类型 | 说明 |
---|---|---|
append(String s) | StringBuffer | 将指定的字符串追加到此字符序列中 |
reverse() | StringBuffer | 将此字符序列用其反转形式取代 |
delete(int start, int end) | StringBuffer | 删除此序列中下标从 start 开始,到 end 结束的子字符串,包括 start,但不包括 end,即前闭后开区间 |
insert(int offset, String str) | StringBuffer | 将 str 插入此序列中下标为 offset 的位置 |
replace(int start, int end, String str) | StringBuffer | 将原字符序列中下标从 start 开始,到 end 结束的子字符串用 str 代替,前闭后开区间 |
capacity() | int | 获取 StringBuffer 的容量 |
length() | int | 获取 StringBuffer 的长度 |
charAt(int index) | char | 返回指定 index 处的 char 值 |
ensureCapacity(int minimumCapacity) | void | 确保容量至少等于给定的最小值 |
getChars(int srcBegin, int srcEnd,char[] dst, int dstBegin) | void | 将字符序列从 srcBegin 开始,到 srcEnd 结束,复制到 dst 数组中 dstBegin 的位置 |
indexOf(String str) | int | 返回该字符序列中第一次出现 str 的下标 |
indexOf(String str, int fromIndex) | int | 返回从该字符序列的 fromIndex 开始,第一次出现 str 的下标 |
lastIndexOf(String str) | int | 返回指定字符串 str 在字符序列最右边出现的下标 |
lastIndexOf(String str, int fromIndex) | int | 返回指定字符串 str 在字符序列从 fromIndex 开始最右边出现的下标 |
setCharAt(int index, char ch) | void | 将字符序列中 index 处的元素设置为 ch |
setLength(int newLength) | void | 设置字符序列的长度 |
substring(int start) | String | 返回一个新的 String,包含当前字符序列从 start 开始的所有字符 |
substring(int start, int end) | String | 返回一个新的 String,包含当前字符序列从 start 开始到 end 结束的所有字符,前闭后开区间 |
toString() | String | 返回此序列中数据的字符串表示形式 |
public class Demo {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("abcdefg");
System.out.println("原始字符串为:" + str);
// 追加 ABCDEFG 到原始字符串中
str.append("ABCDEFG");
System.out.println("追加之后的字符串为:" + str);
// 在下标为8的位置插入"@#$"
str.insert(8,"@#$");
System.out.println("insert:" + str);
// 删除从下标为8开始,到下标为11结束的子字符串,前闭后开区间,包括8,但不包括11,即删除下标为8、9、10的三个字符
str.delete(8,11);
System.out.println("delete:" + str);
// replace,str 的长度可不等于 要替换的子字符串长度
str.replace(7,10,"@#$%^&");
System.out.println("replace:" + str);
// reverse
str.reverse();
System.out.println("reverse:" + str);
}
}
StringBuffer 类的方法同样适用于 StringBuilder。
StringBuilder 基本上没有特定的使用场景,基本上所有的情况下都可以使用 StringBuilder。
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
不可变 | 可变 | 可变 |
线程安全 | 线程不安全 | |
多线程操作字符串 | 单线程操作字符串 |