上一篇博客中为大家介绍了String类的使用,这一篇再为大家介绍一个用于处理字符串的类StringBuffer。
在JDK API中对StringBuffer类的描述如下:
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容为 “start” 的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含 “startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含 “starlet”。
当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
构造方法
方法名 | 说明 |
---|---|
StringBuffer() | 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。 |
StringBuffer(CharSequence seq) | public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。 |
StringBuffer(int capacity) | 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 |
StringBuffer(String str) | 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 |
方法摘要
返回值 | 方法名 | 说明 |
---|---|---|
StringBuffer | append(boolean b) | 将 boolean 参数的字符串表示形式追加到序列 |
StringBuffer | append(char c) | 将 char 参数的字符串表示形式追加到此序列 |
StringBuffer | append(char[] str) | 将 char 数组参数的字符串表示形式追加到此序列 |
StringBuffer | append(char[] str, int offset, int len) | 将 char 数组参数的子数组的字符串表示形式追加到此序列 |
StringBuffer | append(CharSequence s) | 将指定的 CharSequence 追加到该序列 |
StringBuffer | append(CharSequence s, int start, int end) | 将指定 CharSequence 的子序列追加到此序列 |
StringBuffer | append(double d) | 将 double 参数的字符串表示形式追加到此序列 |
StringBuffer | append(float f) | 将 float 参数的字符串表示形式追加到此序列 |
StringBuffer | append(int i) | 将 int 参数的字符串表示形式追加到此序列 |
StringBuffer | append(long lng) | 将 long 参数的字符串表示形式追加到此序列 |
StringBuffer | append(Object obj) | 追加 Object 参数的字符串表示形式 |
StringBuffer | append(String str) | 将指定的字符串追加到此字符序列 |
StringBuffer | append(StringBuffer sb) | 将指定的 StringBuffer 追加到此序列中 |
StringBuffer | appendCodePoint(int codePoint) | 将 codePoint 参数的字符串表示形式追加到此序列 |
int | capacity() | 返回当前容量 |
char | charAt(int index) | 返回此序列中指定索引处的 char 值 |
int | codePointAt(int index) | 返回指定索引处的字符(统一代码点) |
int | codePointBefore(int index) | 返回指定索引前的字符(统一代码点) |
int | codePointCount(int beginIndex, int endIndex) | 返回此序列指定文本范围内的统一代码点 |
StringBuffer | delete(int start, int end) | 移除此序列的子字符串中的字符 |
StringBuffer | deleteCharAt(int index) | 移除此序列指定位置的 char |
void | ensureCapacity(int minimumCapacity) | 确保容量至少等于指定的最小值 |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将字符从此序列复制到目标字符数组 dst |
int | indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引 |
int | indexOf(String str, int fromIndex) | 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引 |
StringBuffer | insert(int offset, boolean b) | 将 boolean 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, char c) | 将 char 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, char[] str) | 将 char 数组参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int index, char[] str, int offset, int len) | 将数组参数 str 的子数组的字符串表示形式插入此序列中 |
StringBuffer | insert(int dstOffset, CharSequence s) | 将指定 CharSequence 插入此序列中 |
StringBuffer | insert(int dstOffset, CharSequence s, int start, int end) | 将指定 CharSequence 的子序列插入此序列中 |
StringBuffer | insert(int offset, double d) | 将 double 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, float f) | 将 float 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, long l) | 将 long 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, Object obj) | 将 Object 参数的字符串表示形式插入此字符序列中 |
StringBuffer | insert(int offset, String str) | 将字符串插入此字符序列中 |
int | lastIndexOf(String str) | 返回最右边出现的指定子字符串在此字符串中的索引 |
int | lastIndexOf(String str, int fromIndex) | 返回最后一次出现的指定子字符串在此字符串中的索引 |
int | length() | 返回长度(字符数) |
int | offsetByCodePoints(int index, int codePointOffset) | 返回此序列中的一个索引,该索引是从给定 index 偏移 codePointOffset 个代码点后得到的 |
StringBuffer | replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符 |
StringBuffer | reverse() | 将此字符序列用其反转形式取代 |
void | setCharAt(int index, char ch) | 将给定索引处的字符设置为 ch |
void | setLength(int newLength) | 设置字符序列的长度 |
CharSequence | subSequence(int start, int end) | 返回一个新的字符序列,该字符序列是此序列的子序列 |
String | substring(int start) | 返回一个新的 String,它包含此字符序列当前所包含的字符子序列 |
String | substring(int start, int end) | 返回一个新的 String,它包含此序列当前所包含的字符子序列 |
String | toString() | 返回此序列中数据的字符串表示形式 |
void | trimToSize() | 尝试减少用于字符序列的存储空间 |
StringBuffer与String区别
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
在通常情况下我们进行选择的顺序是:StringBuilder > StringBuffer > String。
StringBuffer示例
public class StringBufferDemo
{
public static void main(String[] args)
{
StringBuffer buffer = new StringBuffer();
buffer.append("jiang");
System.out.println(buffer);
buffer.append("guq");
buffer.replace(buffer.length() - 1, buffer.length(), "jin");
System.out.println(buffer);
System.out.println(buffer.reverse());
}
}
运行结果如下:
jiang
jianggujin
nijuggnaij