Java 清空 StringBuilder / StringBuffer 变量的几种方法对比

Java 2020-01-29 阅读 382 评论 0

使用 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() 方法。

最后更新 2020-01-29
MIP.watch('startSearch', function (newVal, oldVal) { if(newVal) { var keyword = MIP.getData('keyword'); console.log(keyword); // 替换当前历史记录,新增 MIP.viewer.open('/s/' + keyword, {replace: true}); setTimeout(function () { MIP.setData({startSearch: false}) }, 1000); } }); MIP.watch('goHome', function (newVal, oldVal) { MIP.viewer.open('/', {replace: false}); });