拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何清除 StringBuilder 或 StringBuffer中的数据?

如何清除 StringBuilder 或 StringBuffer中的数据?

白鹭 - 2022-07-21 2179 0 2

一、概述

在本教程中,我们将介绍几种清除StringBuilderStringBuffer的方法,然后详细说明它们。

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. 结论

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


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *