一、概述
在本教程中,我们将介绍几种清除StringBuilder
或StringBuffer
的方法,然后详细说明它们。
2. 清除StringBuilder
2.1。使用setLength
方法
方法setLength
用空值替换作为参数传递的索引之后的所有条目。因此,用0 调用它会删除StringBuilder
的所有条目:
@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(); }
请注意,调用setLength
方法后,StringBuilder
的容量保持不变。
2.2.使用delete
方法
delete
方法在后台使用System.arraycopy
。开始索引之前或结束索引之后的所有索引都被复制到同一个StringBuilder
。
因此,如果我们调用delete
时,开始索引为0,结束索引等于StringBuilder
的长度,我们将复制:
0 之前的索引:没有。
stringBuilder.length()
之后的索引:没有。
结果,删除了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(); }
与setLength
方法一样,对象容量在删除其内容后保持不变。我们还要强调一下,在此过程中不涉及新对象的创建。
3. 清除StringBuffer
所有适用于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(); }
也可以使用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. 性能
让我们与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()); }
我们以秒为单位测量了操作次数。该基准导致以下结果:
Benchmark Mode Cnt Score Error Units evaluateDelete thrpt 25 67943684.417 ± 18116791.770 ops/s evaluateSetLength thrpt 25 37310891.158 ± 994382.978 ops/s
如我们所见,delete
似乎是两者中耗时较少的方法,几乎是2 倍。
5. 结论
在本文中,我们详细介绍了三种清除StringBuilder
或StringBuffer
的方法。
0 评论