2013-08-01 2 views
11

이 코드를 JDK 1.4와 1.5에서 실행 중이며 결과가 다릅니다. 왜 그런 경우입니까?JDK 1.4와 1.5간에 출력이 다른 이유는 무엇입니까?

String str = ""; 
int test = 3; 

str = String.valueOf(test); 
System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]"); 

if (str == "3") { 
    System.out.println("if"); 
} else { 
    System.out.println("else"); 
} 

출력 : JDK에

  • 는 JDK 1.4

    str[3] 
    equals result[true] 
    if 
    
  • 1.5

    str[3] 
    equals result[false] 
    else 
    
+7

문자열 평등은 '=='연산자가 아니라 ' "3". equals (str)'으로 검사됩니다. –

+0

이것은 JDK의 차이점과는 아무런 관련이 없지만 Java에서'String' 비교가 어떻게 작동하는지 이해하고 있습니다. 내 이전의 코멘트 – MadProgrammer

+0

에서 제공된 링크를 확인해보십시오. 자바에서 객체 평등을 비교하려면 equals를 사용해야합니다. 동일한 객체를 참조하는 경우 ==를 사용해야합니다. 만약 그들이 인턴 되었다면 사실이됩니다. – nachokk

답변

11

this page에 따르면, (String#valueOf(int)에 의해 호출 됨) Integer#toString 방법은 1.4에서 다음과 같이 구현됩니다 "3" 리터럴 문자열이 구금 및 "3" == "3"는 항상 true를 반환하기 때문에

public static String toString(int i) { 
    switch(i) { 
     case Integer.MIN_VALUE: return "-2147483648"; 
     case -3: return "-3"; 
     case -2: return "-2"; 
     case -1: return "-1"; 
     case 0: return "0"; 
     case 1: return "1"; 
     case 2: return "2"; 
     case 3: return "3"; 
     case 4: return "4"; 
     case 5: return "5"; 
     case 6: return "6"; 
     case 7: return "7"; 
     case 8: return "8"; 
     case 9: return "9"; 
     case 10: return "10"; 
    } 
    char[] buf = (char[])(perThreadBuffer.get()); 
    int charPos = getChars(i, buf); 
    return new String(buf, charPos, 12 - charPos); 
} 

당신의 결과를 설명 할 수있다.

10 및 11로 시도해 볼 수 있습니다.

참고 : 이미 언급 한대로 Integer#toString의 javadoc은 반환 된 문자열이 인턴 될지 여부를 나타내지 않으므로 두 질문의 출력이 똑같이 유효합니다.

+2

+1 자바 7에서 또 다르다. 이런 행동에 의존해서는 안됩니다. –

4

이것은 인 임프 JLS에 의해 규정되지 않은 조화 상세. equals 방법 점검 두 변수 '값은 프로그래머에 의해 결정될 수있는 몇 가지 방법으로 "동일한"여부를 표시하는 반면

기준 항등 연산자 == 검사, 두 변수가 동일한 실제 객체를 가리 여부를 확인한다. 이 경우, 1.4 JVM은 을 호출하고 1.5 JVM을 호출 할 때 "3" 문자열의 동일한 복사본을 재사용하기 위해 String을 사용할 수 없다는 사실을 이용하고있는 것으로 보입니다. 두 옵션 모두 완벽하게 합법적이므로 이러한 특정 동작에 의존해서는 안됩니다.

0

문자열 리터럴 연산에 "=="연산자를 사용하는 경우 "문자열 풀"에 문자열 리터럴 값이 있는지 여부에 따라 달라지며 "str"은 문자열 JVM입니다 먼저 "문자열 풀"을 찾으면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다. 인턴() 메소드에 대한 설명서에 따라 "문자열 풀"

String str = ""; 
int test = 3; 

str = String.valueOf(test).intern(); 

System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]"); 

if (str == "3") { 
    System.out.println("if"); 
} else { 
    System.out.println("else"); 
} 

에 문자열 리터럴을 사용할 수 있도록하기 위해, 인턴() 메소드에 다음 코드를보십시오 : 인턴() 메소드가 문자열의 내부 테이블을 검색 이 String와 동일한 문자열. 문자열이 테이블에 없으면 추가됩니다. 이 String와 동일한 테이블에 포함 된 문자열에 응답합니다. 동일한 문자열 객체는 항상 동일한 문자열에 대해 응답됩니다.

"=="연산자는 문자열 비교에 적합하지 않습니다. equals() 또는 equalsIgnoreCase() 메서드()를 사용하십시오.

자바 1에서도 사용해 보았습니다.이것은 "논리적

str[3] 
equals result[true] 
if 

이 JDK 1.4의 문제가없고 1.5 : 인턴없이 7 ()의 출력은 출력에 관해서) 인턴

str[3] 
equals result[false] 
else 

(인 오류".

1

java 5 string.valueof()에서 새 문자열을 반환해야합니다. 인턴 (ed) (공유) 문자열보다!

4 출력

동작을 설명
valueOf return interned string 

입니다

valueOf does not return interned string 

그러나 자바에서 자바의 예를

int test = 3; 
    String str = String.valueOf(test); 
    String str2 = String.valueOf(test); 

    if(str == str2) 
     System.out.println("valueOf return interned string"); 
    else 
     System.out.println("valueOf does not return interned string"); 

출력> = 5

다음 사항을 고려!

+0

op가 이미 관찰 한 것을 다시 말하고 있습니다. 문제는 1.4와 1.5가 다르게 행동하는 이유입니다. – assylias

+0

자바 5에서 인턴 (ed) (공유) 문자열 대신 새로운 문자열이 작성 되었기 때문에. 첫 번째 굵은 선을보십시오! –

관련 문제