清除 StringBuilder 或 StringBuffer
瀏覽人數:717最近更新:
一、概述
在本教程中,我們將介紹幾種清除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的方法。
與往常一樣,代碼可 在 GitHub 上獲得。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議