[java] String이 있는데 왜 StringBuilder인가?

나는 StringBuilder처음으로 만났고 Java가 이미 String추가를 허용 하는 매우 강력한 클래스를 가지고 있기 때문에 놀랐습니다 .

왜 2 String등석인가?

자세한 내용은 어디에서 확인할 수 있습니까 StringBuilder?



답변

String추가를 허용하지 않습니다. 에서 호출하는 각 메서드 String는 새 개체를 만들고 반환합니다. String불변 이기 때문 입니다. 내부 상태를 변경할 수 없습니다.

반면 StringBuilder에 변경 가능합니다. 호출 append(..)할 때 새 문자열 객체를 만드는 대신 내부 문자 배열을 변경합니다.

따라서 다음을 갖는 것이 더 효율적입니다.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

대신 str += i500 개의 새로운 문자열 객체를 생성합니다.

이 예에서는 루프를 사용합니다. helios가 주석에 언급했듯이 컴파일러 String d = a + b + c는 다음과 같은 표현식을 자동으로 번역합니다.

String d = new StringBuilder(a).append(b).append(c).toString();

이 있음을 유의하십시오 StringBuffer에 추가 StringBuilder. 차이점은 전자에는 동기화 된 메서드가 있다는 것입니다. 지역 변수로 사용하는 경우 StringBuilder. 그것은 여러 스레드에서 액세스 할 수하는 것이 가능하다는 발생하면 사용 StringBuffer(즉,의 희소)


답변

다음은 그 이유에 대한 구체적인 예입니다.

int total = 50000;
String s = "";
for (int i = 0; i < total; i++) { s += String.valueOf(i); }
// 4828ms

StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); }
// 4ms

보시다시피 성능의 차이가 중요합니다.


답변

String 클래스는 변경 불가능한 반면 StringBuilder는 변경 가능합니다.

String s = "Hello";
s = s + "World";

위의 코드는 String이 변경 불가능하기 때문에 두 개의 객체를 생성합니다.

StringBuilder sb = new StringBuilder("Hello");
sb.append("World");

위의 코드는 StringBuilder가 변경 불가능하지 않기 때문에 하나의 객체 만 생성합니다.

Lesson : String을 여러 번 조작 / 업데이트 / 추가 할 필요가있을 때마다 StringBuilder가 String에 비해 효율적으로 사용됩니다.


답변

StringBuilder는 문자열 구축을위한 것입니다. 특히, 매우 성능이 좋은 방식으로 구축합니다. String 클래스는 많은 것들에 좋지만, 각각의 새로운 문자열은 완전히 새롭고 재 할당 된 문자열이기 때문에 작은 문자열 부분에서 새 문자열을 조립할 때 실제로 끔찍한 성능을 보입니다. ( 불변 ) StringBuilder는 동일한 시퀀스를 제자리에 유지하고 수정합니다 ( mutable ).


답변

StringBuilder 클래스는 변경 가능하며 String과 달리 더 많은 String 객체를 만들 필요없이 문자열의 내용을 수정할 수 있습니다. 이는 문자열을 많이 수정할 때 성능 향상이 될 수 있습니다. 또한 동기화되는 StringBuffer라는 StringBuilder의 대응 물도 있으므로 다중 스레드 환경에 이상적입니다.

String의 가장 큰 문제는 모든 작업이 항상 새 객체를 반환한다는 것입니다.

String s1 = "something";
String s2 = "else";
String s3 = s1 + s2; // this is creating a new object.


답변

StringBuilder는 더 큰 문자열을 다룰 때 좋습니다. 성능 향상에 도움이됩니다.

여기 에 도움 이 된 기사 가 있습니다.

빠른 Google 검색이 도움이 될 수 있습니다. 이제 7 명의 다른 사람을 고용하여 Google 검색을 수행했습니다. 🙂


답변

정확하게 말하면 StringBuilder는 모든 문자열을 추가하는 것은 O (N)이고 String을 추가하는 것은 O (N ^ 2)입니다. 소스 코드를 확인하면 변경 가능한 문자 배열을 유지하여 내부적으로 수행됩니다. StringBuilder는 배열 길이 복제 기술을 사용하여 잠재적으로 필요한 메모리를 두 배로 늘리는 대신 Ammortized O (N ^ 2) 성능 을 달성 합니다. 이 문제를 해결하기 위해 마지막에 trimToSize를 호출 할 수 있지만 일반적으로 StringBuilder 객체는 일시적으로 만 사용됩니다. 최종 문자열 크기에서 좋은 시작 추측을 제공하여 성능을 더욱 향상시킬 수 있습니다.