문제

줄은 불변이 불변입니다. 즉, 일단 만들어지면 변경할 수 없습니다.

그렇다면 이것은 StringBuffer를 만들고 텍스트를 추가 한 것보다 +=로 물건을 추가하면 더 많은 메모리가 필요하다는 것을 의미합니까?

+=를 사용하면 메모리에 저장해야 할 때마다 새 '객체'를 만들 것입니다. 그렇지 않습니까?

도움이 되었습니까?

해결책

예, +=로 매번 새 개체를 만들 것입니다. 그렇다고해서 항상 잘못된 일이라는 의미는 아닙니다. 그것은 당신이 그 값을 문자열로 원하는지 또는 스트링을 더 구축하기 위해 그것을 사용할 것인지에 따라 다릅니다.

당신이 실제로 원하다 결과 x + y 문자열로서, 당신은 문자열 연결을 사용할 수도 있습니다. 그러나 실제로 루프 라운드로 가고 다른 문자열을 추가하고 다른 문자열 등을 추가하는 경우 - 끝에 문자열로 결과를 필요로하는 경우 StringBuffer/StringBuilder가 갈 길입니다. 실제로, 루핑은 실제로 StringBuilder가 현악을 통해 지불하는 곳입니다. 5 또는 10 직접 연결의 성능 차이는 매우 작을 것입니다.2) 연결 대 O (n) stringbuilder와의 복잡성과 복잡성.

Java 5 이상에서는 기본적으로 StringBuilder를 사용해야합니다. 동기화되지 않았지만 거의 항상 괜찮습니다. 스레드간에 하나를 공유하는 것은 매우 드 rare니다.

나는있다 이 모든 것에 대한 기사 유용 할 수 있습니다.

다른 팁

경험의 규칙은 간단합니다.

루프에서 연결을 실행중인 경우 사용하지 마십시오. +=

당신이있는 경우 ~ 아니다 루프에서 연결을 실행합니다 += 단순히 중요하지 않습니다. (성능 중요한 응용 프로그램이 아니라면

Java 5 이상에서 StringBuffer는 스레드 안전성이므로 필요하지 않으면 지불하지 말아야 할 간접비가 있습니다. StringBuilder는 API가 동일하지만 스레드 안전하지는 않습니다 (즉, 단일 스레드 내부에서만 사용해야합니다).

예, 큰 문자열을 구축하는 경우 StringBuilder를 사용하는 것이 더 효율적입니다. API의 일부로 StringBuilder 또는 StringBuffer를 통과하는 것은 가치가 없습니다. 이것은 너무 혼란 스럽습니다.

위에 게시 된 모든 답변에 동의하지만 Java가 구현되는 방식에 대해 더 많이 이해하는 데 도움이됩니다. JVM은 StringBuffers를 내부적으로 사용하여 String + 연산자를 컴파일합니다 ( StringBuffer Javadoc):

문자열 버퍼는 컴파일러에서 이진 문자열 연결 연산자 +를 구현하는 데 사용됩니다. 예를 들어 코드 :

     x = "a" + 4 + "c"

다음과 동등한 것으로 컴파일됩니다.

     x = new StringBuffer().append("a").append(4).append("c")
                           .toString()

비슷하게, x += "some new string" 동일합니다 x = x + "some new string". 내가 어디로 가고 있는지 보십니까?

StringBuffer를 사용하여 많은 문자열 연결을하고 있다면 성능이 향상되지만 간단한 문자열 연결 만 수행하는 경우 Java 컴파일러가 아마도 최적화 할 수 있으며 차이를 알지 못할 것입니다. 성능

예. 문자열은 불변입니다. 때때로 사용하기 위해서는 += 괜찮습니다. += 작동이 집중적이면 StringBuilder로 전환해야합니다.

그러나 쓰레기 수집가는 그것들에 대한 언급이 없으면 오래된 문자열을 해방하게됩니다.

정확히. 스레드 안전이 문제가되지 않으면 StringBuilder를 사용해야합니다.

참고 사항 : 동일한 백킹 char []를 사용하는 여러 문자열 객체가있을 수 있습니다. 예를 들어 substring ()을 사용할 때마다 새로운 char []가 생성되지 않아 매우 효율적입니다.

또한 컴파일러는 귀하를 위해 약간의 최적화를 수행 할 수 있습니다. 예를 들어, 당신이하는 경우

static final String FOO = "foo";
static final String BAR = "bar"; 

String getFoobar() {
  return FOO + BAR; // no string concatenation at runtime
}

컴파일러가 내부적으로 StringBuilder를 사용하여 가능한 경우 String 연결을 최적화하여 미래에 아직 아닐 경우에는 놀라지 않을 것입니다.

버려진 끈으로 메모리를 수집하기 위해 GC에 의존한다고 생각합니다. 따라서 문자열 조작에서 많은 작업이 있으면 문자열 빌더로 += 수행하면 확실히 빠릅니다. 그러나 대부분의 경우 문제가되지 않아야합니다.

그렇습니다. 이것이 바로 StringBuffer를 사용하여 많은 문자열을 연결 해야하는 이유입니다.

또한 Java 5이므로 대부분 StringBuilder를 선호해야합니다. 그것은 단지 일종의 동기화되지 않은 StringBuffer입니다.

당신은 문자열이 불변이라는 것이 옳습니다. 따라서 많은 문자열 연결을하는 동안 메모리를 보존하려고한다면 += 대신 StringBuilder를 사용해야합니다.

그러나 당신은 신경 쓰지 않을 수도 있습니다. 프로그램은 인간 독자를 위해 작성되므로 명확하게 갈 수 있습니다. 최적화하는 것이 중요하다면 먼저 프로파일을 프로파일해야합니다. 프로그램이 문자열 활동에 크게 가중치를 부여하지 않는 한 다른 병목 현상이있을 수 있습니다.

아니

더 많은 메모리를 사용하지 않습니다. 예, 새로운 개체가 만들어졌지만 오래된 개체는 재활용됩니다. 결국, 사용 된 메모리의 양은 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top