2011-12-20 2 views
5

나는 Java supports constant folding of primitive types을 발견했으나, String은?자바 컴파일러에 문자열 상수 폴딩이 포함되어 있습니까?

나는 다음과 같은 소스 코드를 컴파일 된 코드로 전환 무엇

out.write("" 
     + "<markup>" 
     + "<nested>" 
     + "Easier to read if it is split into multiple lines" 
     + "</nested>" 
     + "</markup>" 
     + ""); 

을 작성하는 경우?

결합 버전? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

덜 효율적인 런타임 연결 버전입니까? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

+0

문자열 연결은 장치 쓰기보다 약 100 배 빠릅니다. 그것이 실제로는별로 중요하지 않을 것입니다. (하지만 그렇습니다.) –

+0

저는 랩탑에서 503 배 느린 속도로 테스트를했습니다. –

+1

실제로 JLS에서 요구하는 동작입니다./생성 된 코드는'javap -c'로 볼 수 있습니다. –

답변

14

여기 쉽게 테스트입니다 : out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

-1

그것은 효과적으로에 번역

public static void main(final String[] args) { 
    final String a = "1" + "2"; 
    final String b = "12";   

    System.out.println(a == b); 
} 

출력 :

true 

그래서, 그래, 컴파일러는 접을 것입니다.

1

결합 된 버전이 사용됩니다.
컴파일러는이를 자동으로 최적화하여 문자열 풀에 넣습니다.

이 줄을 쓰면이 동작을 쉽게 증명할 수 있습니다. 이 해당 인쇄 그게

System.out.println("abc" == "a" + ("b" + "c")); // Prints true 

, 그것은 동일한 목적 있음을 의미한다. 컴파일러는 "abc""a" + ("b" + "c")을 최적화

  1. : 그 때문에 두 가지입니다.
  2. 컴파일러는 모든 문자열 리터럴을 문자열 풀에 넣습니다. 이 동작은 String Interning이라고합니다.
+1

이 동작의 첫 번째 부분은 상수 식 평가라고합니다. – EJP