아뇨.
첫째, 시맨틱에는 약간의 차이가 있습니다. 경우 a
이며 null
, 다음 a.concat(b)
을 던졌습니다 NullPointerException
하지만 a+=b
의 원래 값으로 취급 a
이 마치를 null
. 또한이 concat()
메서드는 String
값만 받아들이는 반면 +
연산자는 인수를 String으로 자동 변환합니다 ( toString()
객체 의 메서드 사용 ). 따라서이 concat()
방법은 허용 되는 방식이 더 엄격합니다.
후드를 살펴 보려면 간단한 클래스를 작성하십시오. a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
이제 분해합니다 javap -c
(Sun JDK에 포함). 다음을 포함한 목록이 나타납니다.
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
그래서, a += b
하는 것과 동일
a = new StringBuilder()
.append(a)
.append(b)
.toString();
concat
방법은 빨리해야한다. 그러나 더 많은 문자열을 사용하면 StringBuilder
적어도 성능 측면 에서이 방법이 승리합니다.
소스 코드 String
및 StringBuilder
패키지 전용 기본 클래스는 Sun JDK의 src.zip에 있습니다. char 배열을 만들고 (필요한 경우 크기 조정) final을 만들 때 버리는 것을 알 수 있습니다 String
. 실제로 메모리 할당은 놀라 울 정도로 빠릅니다.
업데이트 : Pawel Adamski가 언급 한 것처럼 최신 HotSpot에서 성능이 변경되었습니다. javac
여전히 정확히 동일한 코드를 생성하지만 바이트 코드 컴파일러는 속임수를 사용합니다. 코드 전체가 버려지기 때문에 간단한 테스트가 완전히 실패합니다. 합산 System.identityHashCode
(not String.hashCode
)은 StringBuffer
코드가 약간의 이점을 가지고 있음을 보여줍니다 . 다음 업데이트가 릴리스되거나 다른 JVM을 사용하는 경우 변경 될 수 있습니다. 에서 @lukaseder , 핫스팟 JVM의 내장 함수의 목록 .