2017-01-23 1 views
3

는 :힙 CONCATENATE에 무슨 일이 일어날 지 같은 문자열

String text = "a" + "b" + "c"; 
String text = "a" + "a" + "a"; 

나는 첫 번째 변종에서 만든 세 개의 String 오브젝트가있을 것이라는 점을 알고있다. 하지만 두 번째로? JVM에서 최적화 된 것이 있습니까?

+6

"세 개의 String 개체가 생성됩니다"Nope. 컴파일러는 이것을''abc ''와''aaa''와 똑같이 취급합니다. –

+1

또한 컴파일 할 수 없으므로 코드를 실행할 수 없습니다 (이름이 같은 두 변수). –

+0

컴파일러는이를 최적화 할 것입니다. – CKing

답변

2

는 JLS는이 정보를 제공합니다 질문에 대답하려면 :

JLS (JLS-15.28)의 상태가 :

항상 할 수 있도록 "구금"하는 String 형의

상수 표현 은 String.intern 메소드를 사용하여 고유 한 인스턴스를 공유합니다.

즉, 코드에서 상수 표현식을 사용하면 참조하는 캐시에 저장됩니다.

그러나는 하나의 상수 표현이거나 궁금한 점이 있다면 3 가지 상수 표현입니까?

우리는이 질문에 대한 답변을 JLS의 다른 지점에서 가지고 있습니다.

JLS (JLS-3.10.5은, 포인트 (4))이 실제로 그 내용의 : 컴파일시에 계산하고 이들이 리터럴 것처럼 취급 상수 식 (§15.28)에 의해 계산

현 .일정한 표현

예 :

"The integer " + Long.MAX_VALUE + " is mighty big." 

그것은 즉시 컴파일 시간 으로 발현 전술 한 String 문자임을 의미한다. 당신이 당신의 샘플 예제에서하고있는 무엇을 어떤 방법으로

, 그것은에 다음과 같습니다

String text = "a" + "b" + "c"; 
text = "a" + "a" + "a"; 

따라서, String text = "a" + "b" + "c"; 는 상수 식 "a" + "b" + "c"이로 처리됩니다으로 그 "abc"이며, 하나의 String를 생성 단일 리터럴.

text = "a" + "a" + "a";의 경우 정확히 동일하며 컴파일러 용으로는 String 리터럴입니다.

마지막으로 두 가지 지침을 사용하면 두 개의 문자열이 힙에 포함됩니다.

2

실제로는 각각 1 개의 문자열 리터럴이 있습니다. JLS Sec 3.10.5 바와 같이

리터럴 긴 문자열은 항상 짧은 조각으로 분리 될 수 있고, 문자열 결합 연산자 +를 사용하여 (아마도 괄호)로 기록 식 (§15.18.1).

그래서, "a" + "b" + "c""a" + "a" + "a"는 규격에 의해 "abc""aaa" 동일하다. JLS Sec 15.28에 기재된

또한 이러한 일정한 표현이다 :

정수 표현 급격 완료되지 않으며, 단지 다음을 사용하여 구성되는 원시 형 또는 문자열의 값을 나타내는 식 : 프리미티브 타입 및 형식 문자열 리터럴 (§3.10.1, §3.10.2, §3.10.3, §3.10.4, §3.10.5) 의

  • 리터럴...

    String 유형의 상수 표현식은 String.intern 메소드를 사용하여 고유 한 인스턴스를 공유 할 수 있도록 항상 "interned"입니다.

관련 문제