Java 清空 StringBuilder / StringBuffer 变量的几种方法对比
使用 StringBuilder / StringBuffer,偶尔需要对内容进行清空,以下介绍几种清空的方法,并说明其原理。
重新赋值一个新的实例
例如
public static void main(String args[]) {
StringBuffer sb;
String[] arr = {"one", "two", "three"};
for (int i = 0; i < arr.length; i++) {
sb = new StringBuffer();
sb.append(arr[i]);
System.out.println(sb);
}
}
输出
one
two
three
循环的每次迭代创建一个新的 StringBuilder/StringBuffer 对象。创建对象是一项昂贵的操作,因为它涉及为新对象分配新的内存。另外,垃圾收集必须收集旧的未使用的对象。如果由于迭代次数可能会对性能造成影响而导致迭代次数过多,则应避免使用此选项。
使用 delete 方法
使用 delete 方法,指定 start 和 end 参数,删除 StringBuffer 的内容。
public static void main(String args[]) {
StringBuffer sb = new StringBuffer();
String[] arr = {"one", "two", "three"};
for (int i = 0; i < arr.length; i++) {
sb.delete(0, sb.length());
sb.append(arr[i]);
System.out.println(sb);
}
}
输出
one
two
three
delete(删除方法)在内部分配具有指定长度的新缓冲区,然后将 StringBuilder/StringBuffer 缓冲区的修改内容复制到新缓冲区。如果迭代次数过多,这又是一项昂贵的操作。
使用 setLength 方法
使用 StringBuffer 的 setLength ,
例如:
public static void main(String args[]) {
StringBuffer sb = new StringBuffer();
String[] arr = {"one", "two", "three"};
for (int i = 0; i < arr.length; i++) {
sb.setLength(0);
sb.append(arr[i]);
System.out.println(sb);
}
}
输出
one
two
three
setLength() 方法不涉及任何新分配和垃圾回收。 setLength方法只是将内部缓冲区长度变量重置为0。原始缓冲区保留在内存中,因此不需要新的内存分配,因此这是清除 StringBuilder/StringBuffer 的最快方法。
总结
综上所述,StringBuilder / StringBuffer 内容清空的效率,最快的是 setLength() 方法。