존 소총 (항상) 나머지는 이미 모든 것을 필요 말했다하지만 난 정말
봐 ... 어쩌면이 아닌 기존의 성능 향상을 위해 사냥하는 것을 강조하고 싶습니다 이 코드 :
public class StringBuilding {
public static void main(String args[]) {
String a = "The first part";
String b = "The second part";
String res = a+b;
System.gc(); // Inserted to make it easier to see "before" and "after" below
res = new StringBuilder().append(a).append(b).toString();
}
}
당신이 그것을 컴파일은 javap로 분해하면, 이것은 당신이 무엇을 얻을 수 있습니다.
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String The first part
2: astore_1
3: ldc #3; //String The second part
5: astore_2
6: new #4; //class java/lang/StringBuilder
9: dup
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: invokestatic #8; //Method java/lang/System.gc:()V
28: new #4; //class java/lang/StringBuilder
31: dup
32: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V
35: aload_1
36: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: aload_2
40: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
43: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
46: astore_3
47: return
6-21은 28-43과 거의 같습니다. 별로 최적화하지 않았습니까?
편집 : 루프 문제는 유효하지만 ...
정확합니다. 그래서 FindBugs는 루프 만 검사합니다. –
뿐만 아니라 컴파일러 (적어도 javac)는 Concatentation의 대부분을 StringBuffer/StringBuilder.append()로 변환합니다. –
물론 ...그러나 후손을위한 좋은 메모입니다. 컴파일 타임에 최적화 할 수없는 프로그램 방식의 연결 체인 (예 : 루프)이있는 상황이 대부분 걱정됩니다. – Uri