Skip to content

item 63 dodo4513

lsucret edited this page Sep 10, 2020 · 1 revision

아이템63 문자열 연결은 느리니 주의하라

  • 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n2에 비례한다. 문자열은 불변(아이템 17)이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과다.
public String statement() {
    String result = "";
    for (int i = 0; i < numItems(); i++)
        result += lineForItem(i); // 문자열 연결
    return result;
}
  • 품목이 많을 경우 이 메서드는 심각하게 느려질 수 있다. 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자
public String statement2() {
    StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
    for (int i = 0; i < numItems(); i++)
        b.append(lineForItem(i));
    return b.toString();
}
  • 자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 크다.
  • statement 메서드의 수행 시간은 품목 수의 제곱이 비례해 늘어나고 statement2는 선형으로 늘어나므로, 품목 수가 늘어날수록 성능 격차도 점점 벌어질 것이다.
  • statement2에서 StringBuilder를 전체 결과를 담기에 충분한 크기로 초기화한 점을 잊지 말자.

핵심정리

원칙은 간단하다.
성능에 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자.
대신 StringBuilder의 append 메서드를 사용하라

Clone this wiki locally