2013-03-18 1 views
3

javac 명령 줄을 사용하여 컴파일 된 코드를 검토 한 결과 + 연산자와 문자열 연결을 사용할 때마다 컴파일 된 코드가 StringBuilder의 append() 메소드로 바뀌 었습니다. 이제 StringBuilder와 String concatenation을 사용하는 것이 유사한 바이트 코드를 가지고 있기 때문에 동일한 성능을 가지고 있다고 생각합니까? 맞습니까?java : StringBuilder로 변환 된 바이트 코드의 concat 문자열

답변

11

네, 맞습니다! 그러나 루프 안에서 연결하면 동작이 다릅니다. 예 :

String str = "Some string"; 
for (int i = 0; i < 10; i++) { 
    str += i; 
} 

새로운 StringBuilder는 STR (초기 값)마다 하나의 루프 반복에서 모든 말 구성 될 초기 문자열 (str의 초기 값과 실제로 StringBuilder)와 연결이있을 것이다 반복.
루프에서 문자열 연결을 사용할 때만 StringBuilder를 직접 만들어야합니다.

0

주된 차이점 (컴파일러가 문자열 연결에 StringBuilder을 사용하는 이유)은 String이 변경 불가능하다는 반면에 StringBuilder은 변경되지 않습니다.

예를 들어 문자열을 사용하여 s1 + s2 + s3을 계산하려면 s1의 문자를 두 번 복사해야합니다. 이것은 StringBuilder을 사용하여 피할 수 있습니다.

이 최적화

명시 적으로 JLS 허용된다

구현을 만든 다음 중간 String 객체를 폐기 방지하기 위해 한 번에 변환 및 연결을 수행하도록 선택할 수 있습니다. 반복되는 문자열 연결의 성능을 높이려면 Java 컴파일러에서 StringBuffer 클래스 또는 유사한 기술을 사용하여 식의 평가에 의해 생성 된 중간 String 개체의 수를 줄이십시오.