Java 中 StringBuffer 的使用
I. StringBuffer
StringBuffer 是线程安全的可变字符序列, 一个类似于 String 的字符串缓冲区,但不能修改。在任意时间点上它都包括某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 所谓线程安全,意思是可以将 StringBuffer 安全的用于多个线程,可以在必要时对这些方法进行同步,从而任意特定实例上的所有操作就像是串行顺序发生的,该顺序和所涉及的每个线程进行的方法调用顺序一致。
II. StringBuffer 和 String 的区别
- 由于 String 生成的字符串都是字面常量,这些字符串都被保存在方法区内存中的字符串池(string pool)中,它们是不可改变的。而 StringBuffer 的长度和内容是可以通过方法的调用来改变。
- 在字符串拼接时,String 是先在字符串池中找字符串是否已经存在,不存在就在字符串池创造一个新的字符串,存在则直接返回。这样带来的问题是字符串池中可能会有很多不再使用的字符串常量,造成空间的浪费。StringBuffer 进行字符串拼接时,则不会造成太多的空间浪费
III. StringBuffer 的构造方法
public StringBuffer()
: 无参构造public StringBuffer(int capacity)
: 指定容量的字符串缓冲区对象public StringBuffer(String str)
: 指定字符串内容的字符串缓冲区对象
IV. StringBuffer 的方法
public int capacity()
: 返回当前容量, 理论长度, 默认16个字符,动态分配public int length()
: 返回长度(字符数), 实际长度
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println(sb);
System.out.println(sb.capacity());
System.out.println(sb.length());
System.out.println("==================");
StringBuffer sb2 = new StringBuffer(50);
System.out.println(sb2);
System.out.println(sb2.capacity());
System.out.println(sb2.length());
System.out.println("==================");
StringBuffer sb3 = new StringBuffer("helloworld");
System.out.println(sb3);
System.out.println(sb3.capacity());
System.out.println(sb3.length());
System.out.println("==================");
}
}
//result
16
0
==================
50
0
==================
helloworld
26
10
==================
public StringBuffer append()
: 把任意类型添加到字符串缓冲区里,并返回字符串缓冲区本身public StringBuffer insert(int offset, String str)
: 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身, 注意字符串 index 从 0 开始public StringBuffer deleteCharAt(int index)
: 删除指定位置的字符,并返回本身public StringBuffer delete(int start, int end)
: 删除从之指定位置开始,指定位置结束的内容(左闭右开),并返回本身public StringBuffer replace(int start, int end, String str)
: 替换从start开始到end (左闭右开),用str替换public StringBuffer reverse()
: 反转字符串本身,并返回自身public String subString(int start)
: 截取 StringBuffer 字符串, 从 start 位置到结束,返回一个新Stringpublic String subStirng(int start, int end)
: 截取从start到end的字符串 (左闭右开), 返回一个新String
V. String 和 StringBuffer 的互换
有时候,我们需要用 StringBuffer 的功能, 就要把 String 对象转换成一个 StringBuffer对象,但最后我们可能需要的结果是一个 String 类型,所以还要转换回来
String 转换成 StringBuffer
不能直接把一个 String 赋值给一个 StringBuffer, 但有两种方式可以将一个 String 对象转换成一个 StringBuffer 对象:
- 通过构造方法
public StringBuffer string2StringBuffer(String string){
return new StringBuffer(string);
}
- 通过 append 方法
public StringBuffer string2StringBuffer(String string){
StringBuffer sb = new StringBuffer();
sb.append(string);
return sb;
}
StringBuffer 转换成 String
同样也不能直接把一个 StringBuffer 直接转换成 String
- 通过 String 的构造方法
public stringBuffer2String(StringBuffer sb){
return new String(sb)
}
- 通过 toString 方法
public stringBuffer2String(StringBuffer sb){
return sb.toString();
}
VI. Array to String
将数组拼接成一个字符串 给出一个数组 { 5, 4, 5, 2, 6}
, 将它转换成 [5, 4, 5, 2, 4]
- 字符串拼接: 浪费内存资源,会在字符串池中生成很多无关的字符串
package org.lovian.stringbuffer;
/**
* ArrayToString
* @author PENG Zhengshuai
* @lovian.org
*/
public class ArrayToString {
public static void main(String[] args) {
int[] array = { 5, 4, 5, 2, 6};
System.out.println(arrayToString(array));
}
public static String arrayToString(int[] array){
String s = "";
s += "[";
for(int i = 0; i < array.length; i++){
if(i == array.length - 1){
s += i;
}else{
s += array[i];
s += ", ";
}
}
s += "]";
return s;
}
}
- 用 StringBuffer 做拼接, 不会生成多个字符串常量,所以效率更好
package org.lovian.stringbuffer;
/**
* ArrayToString
* @author PENG Zhengshuai
* @lovian.org
*/
public class ArrayToString2 {
public static void main(String[] args) {
int[] array = { 5, 4, 5, 2, 6};
System.out.println(arrayToString(array));
}
public static String arrayToString(int[] array){
StringBuffer sb = new StringBuffer();
sb.append("[");
for(int i = 0; i < array.length; i++){
if(i == array.length -1){
sb.append(array[i]);
}else{
sb.append(array[i] + ",");
}
}
sb.append("]");
return sb.toString();
}
}
VII. StringBuilder
StringBuilder 是一个可变的字符序列,它提供了一个和 StringBuffer 兼容的 API,但不能保证同步。StringBuilder 被设计用作 StringBuffer 的一个替换类,用在 StringBuffer 被某个单线程适用的时候,建议在不考虑线程安全的情况下,优先使用 StringBuilder, 使用API 和 StringBuffer 相同。因为大多数情况下, StringBuilder 比 StringBuffer 要快
Share this on