2017-10-08 7 views
0
String a = "x"; 
String b = a + "y"; 
String c = "xy"; 
System.out.println(b==c); 

인쇄 이유 거짓?인테르의 경우 Concat

"xy"(+ "y")는 인턴 될 것이며 변수 c가 생성 될 때 컴파일러는 리터럴 "xy"가 문자열 상수 풀에 존재하는지 확인한 다음 동일한 참조를 할당합니다 ~ c.

참고 : 저는 equals() vs == 연산자를 요구하지 않습니다.

+0

가' "XY"'구금되는 통상 발견 그 뒤에 자바

class Test { public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " "); System.out.print((Other.hello == hello) + " "); System.out.print((other.Other.hello == hello) + " "); System.out.print((hello == ("Hel"+"lo")) + " "); System.out.print((hello == ("Hel"+lo)) + " "); System.out.println(hello == ("Hel"+lo).intern()); } } class Other { static String hello = "Hello"; } 

에 인턴 문자열의 예제 출력하지만, 결과의'+ " ''a''가 최종이 아니기 때문에''xy''가''xy''가''아니다 ',''xy''를 결과로 사용하지 않습니다. –

+1

가능한 [Java에서 final로 선언 된 == 문자열 비교] (https://stackoverflow.com/questions/19418427/comparing-strings-with-which-are-declared-final-in-java) – Ravi

+0

다른 답변 : 또한 시도, 그것에 의존하지 마십시오. 코드가 재사용되면 부서지기 쉽습니다. – eckes

답변

0

c에 할당 된대로 "xy"이 문자열 풀 (intern에 사용됨)에 추가되는 이유는 컴파일 타임에 값이 알려지기 때문입니다.

a+"y"은 컴파일 타임에는 알 수 없지만 런타임에만 나타납니다. intern은 값 비싼 연산이기 때문에 개발자가 명시 적으로 코드를 작성하지 않으면 정상적으로 수행되지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 좋아요, 그래서 변수 b는 스택에 나타납니다. 여기서 c는 문자열 상수 풀을 나타낼 것입니까? –

+0

기술적으로 'b'는 힙에있는 문자열을 참조하지만 그렇지 않은 경우는 그렇습니다. –

1

두 개의 문자열 리터럴을 연결하여 문자열을 형성하면 해당 문자열도 포함됩니다. 여기

String a = "x"; 
String b = a + "y"; // a is not a string literal, so no interning 
------------------------------------------------------------------------------------------ 
String b = "x" + "y"; // on the other hand, "x" is a string literal 
String c = "xy"; 

System.out.println(b == c); // true 

true 
true 
true 
true 
false 
true