清除 StringBuilder 或 StringBuffer
瀏覽人數:479最近更新:
一、概述
在本教程中,我們將介紹幾種清除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國際》許可協議