Clearing a StringBuilder or StringBuffer – 清除一个StringBuilder或StringBuffer

最后修改: 2022年 7月 10日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this tutorial, we’ll present a couple of methods to clear a StringBuilder or StringBuffer, then elaborate on them.

在本教程中,我们将介绍几种清除StringBuilderStringBuffer的方法,然后对它们进行阐述。

2. Clearing a StringBuilder

2.清除一个StringBuilder

2.1. Use the setLength Method

2.1.使用 setLength方法

The method setLength updates the inner length of the StringBuilder. All entries after the length are then ignored when manipulating the StringBuilder. Thus, calling it with 0 clears its content:

方法setLength更新了StringBuilder的内部长度。然后在操作StringBuilder时,所有长度之后的条目都被忽略。因此,用0调用它可以清除其内容。

@Test
void whenSetLengthToZero_ThenStringBuilderIsCleared() {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("Hello World");
    int initialCapacity = stringBuilder.capacity();
    stringBuilder.setLength(0);
    assertEquals("", stringBuilder.toString());
    assertEquals(initialCapacity, stringBuilder.capacity();
}

Let’s note that after we call the setLength method, the capacity of the StringBuilder remains the same.

让我们注意,在我们调用setLength方法后,StringBuilder的容量保持不变。

2.2. Use the delete Method

2.2.使用delete方法

The delete method uses System.arraycopy in the background. All indexes before the start index or after the end index are copied to the same StringBuilder.

delete方法在后台使用System.arraycopy。所有开始索引之前或结束索引之后的索引都被复制到同一个StringBuilder

Thus, if we call delete with a start index of 0 and an end index equal to the length of the StringBuilder, we’ll copy:

因此,如果我们调用delete,开始索引为0,结束索引等于StringBuilder的长度,我们将复制。

  • The indexes before 0: there are none.
  • The indexes after stringBuilder.length(): there are none.

As a result, all the content of the StringBuilder is removed:

结果,StringBuilder的所有内容被删除。

@Test
void whenDeleteAll_ThenStringBuilderIsCleared() {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("Hello World");
    int initialCapacity = stringBuilder.capacity();
    stringBuilder.delete(0, stringBuilder.length());
    assertEquals("", stringBuilder.toString());
    assertEquals(initialCapacity, stringBuilder.capacity();
}

As with the setLength method, the object capacity remains the same after the deletion of its content. Let’s also underline that no new object creation was involved during this process.

setLength方法一样,对象的容量在删除其内容后保持不变。让我们也强调一下,在这个过程中没有涉及新的对象的创建。

3. Clearing a StringBuffer

3.清除一个StringBuffer

All the methods that work for StringBuilder work in the same way with StringBuffer. Furthermore, all the remarks on the capacity of the objects remain valid.
Let’s showcase an example with the setLength method:

所有对StringBuilder起作用的方法对StringBuffer起作用的方式相同。此外,所有关于对象容量的评论仍然有效。
让我们来展示一个使用setLength方法的例子。

@Test
void whenSetLengthToZero_ThenStringBufferIsCleared() {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("Hello World");
    int initialCapacity = stringBuffer.capacity();
    stringBuffer.setLength(0);
    assertEquals("", stringBuffer.toString());
    assertEquals(initialCapacity, stringBuffer.capacity();
}

It is also possible to use the delete method:

也可以使用delete方法。

@Test
void whenDeleteAll_ThenStringBufferIsCleared() {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("Hello World");
    int initialCapacity = stringBuffer.capacity();
    stringBuffer.delete(0, stringBuffer.length());
    assertEquals("", stringBuffer.toString());
    assertEquals(initialCapacity, stringBuffer.capacity();
}

4. Performance

4.业绩

Let’s do a quick performance comparison with JMH. Let’s compare each of the three methods for our StringBuilder:

让我们用JMH做一个快速的性能比较。让我们分别比较一下我们的StringBuilder的三种方法。

@State(Scope.Benchmark)
public static class MyState {
    final String HELLO = "Hello World";
    final StringBuilder sb = new StringBuilder().append(HELLO);
}

@Benchmark
public void evaluateSetLength(Blackhole blackhole, MyState state) {
    state.sb.setLength(0);
    blackhole.consume(state.sb.toString());
}

@Benchmark
public void evaluateDelete(Blackhole blackhole, MyState state) {
    state.sb.delete(0, state.sb.length());
    blackhole.consume(state.sb.toString());
}

We’ve measured the number of operations by second. This benchmark leads to the following result:

我们按秒测量了操作的数量。这个基准导致了以下结果。

Benchmark                  Mode   Cnt         Score          Error  Units
evaluateDelete             thrpt   25  67943684.417 ± 18116791.770  ops/s
evaluateSetLength          thrpt   25  37310891.158 ±   994382.978  ops/s

As we can see, delete seems to be the less time-consuming method of the two by almost a factor of 2.

我们可以看到,删除似乎是两种方法中耗时较少的一种,几乎是2倍。

5. Conclusion

5.总结

In this article, we’ve detailed three methods to clear a StringBuilder or a StringBuffer.

在这篇文章中,我们详细介绍了清除StringBuilderStringBuffer的三种方法。

As always, the code is available over on GitHub.

像往常一样,代码可在GitHub上获得