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에서 사용할 수 있습니다 .

Generic footer banner