Java에서는 "+"연산자와 StringBuilder 사용 사이에 성능 차이가 있습니까?


대답 1:

Java에서는 "+"연산자와 StringBuilder 사용 사이에 성능 차이가 있습니까?

다음과 같은 한 줄로 :

문자열 string1 = "1"+ "2";
문자열 string2 = new StringBuilder (“one”). append (“two”). toString ();

성능 차이가 없어야합니다. 사실, 현대 Java 생태계에서 첫 번째는 컴파일 타임에 두 번째에 최적화됩니다. 이것이 실제로 작동하는지 확인하려면 가장 좋아하는 디버거를 사용하여 처음으로 시도하십시오.

그러나 연결 문자열이 별도의 줄에 있거나 for 루프에있는 경우 :

문자열 string1 =“”;
StringBuilder sb = new StringBuilder ();

for (정수 i = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}

문자열 string2 = sb.toString ();

그런 다음 StringBuilder를 사용하는 것이보다 "효율적"이며 때로는 더 복잡한 문자열을 만드는 데 선호되는 방법입니다. 내가 아는 한, 현재 Java 컴파일러는 StringBuilder에 반복 +를 최적화하지 않습니다.


대답 2:

짧은 대답 :있을 수 있지만 대부분 걱정할 가치가 없습니다. 조기 최적화보다 명확한 코드를 선호하십시오.

최신 JVM은 "+"를 사용하여 문자열 연결을 최적화하고이를 StringBuilder로 변환 할 수 있으며 결과 String의 길이를 확인할 수 있으므로 시작시 StringBuilder에 올바른 크기를 할당 할 수 있습니다. 기본 배열 크기를 사용하여 StringBuilder를 직접 만드는 경우 나중에 char 배열을 확대해야 할 수 있습니다.이 경우 배열 복사가 포함되므로 실제로 느려질 수 있습니다.

Java 9부터는 문자열 연결이 훨씬 최적화되어 런타임에 전략이 결정되었습니다.

루프에서 반복적으로 문자열에 추가하는 경우 StringBuilder를 사용하여 잘못 할 수는 없지만 알려진 크기를 미리 할당하십시오. 루프 외부에서는 더 읽기 쉽도록 "+"로 고정하십시오. JVM이 귀하보다 최적화하는 데 도움이 될 것입니다.