1. 개요
이 사용방법(예제)에서는 StringBuilder 또는 StringBuffer 를 지우는 몇 가지 방법을 제시한 다음 자세히 설명합니다.
2. StringBuilder 지우기
2.1. setLength 방법 사용
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();
}
setLength 메서드 를 호출한 후에도 StringBuilder 의 용량은 동일하게 유지됩니다.
2.2. 삭제 방법 사용
삭제 방법은 백그라운드 에서 System.arraycopy 를 사용합니다. 시작 인덱스 이전 또는 종료 인덱스 이후의 모든 인덱스는 동일한 StringBuilder 에 복사됩니다 .
따라서 시작 인덱스 0과 StringBuilder 길이와 같은 끝 인덱스로 delete 를 호출하면 다음과 같이 복사 됩니다.
- 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();
}
삭제 방법 을 사용할 수도 있습니다 .
@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
우리가 볼 수 있듯이 삭제 는 두 가지 방법 중 거의 2배 정도 시간이 적게 걸리는 방법인 것 같습니다.
5. 결론
이 기사에서는 StringBuilder 또는 StringBuffer 를 지우는 세 가지 방법을 자세히 설명했습니다 .
항상 그렇듯이 코드는 GitHub에서 사용할 수 있습니다 .