2011-08-02 1 views
3

가능한 중복 : 래퍼 클래스에 대한 객체 항등 연산자은, 랩 된 값이 있는지 여부에 따라 다른 결과를 생성하는 경우로
Wrapper class and == operator자바 래퍼 클래스가 평등 객체 - 이상한 행동

보인다 바이트 범위 또는 아닙니다.

System.out.println("smaller than byte"); 

Integer i1 = 1; 

Integer i2 = 1; 

if (i1 == i2) System.out.println("same"); 

if (i1 != i2) System.out.println("not same"); 

System.out.println("larger than byte"); 

Integer i3 = 128; 

Integer i4 = 128; 

if (i3 == i4) System.out.println("same"); 

if (i3 != i4) System.out.println("not same"); 

다음과 같은 출력을 생성합니다 :

smaller than byte 

same 

larger than byte 

not same 

주 : 다음은이 동작을 보여하는 코드는 내가 리눅스에서 핫스팟에이 출력을 (1.6.0_24-B07를 구축) 얻었다. Long과 아마도 Short에 대해서도 같은 일이 발생합니다 (테스트하지는 않았습니다).

참고 : 리눅스에서 다른 HotSpot 빌드와 동일한 출력 누구든지 설명 할 수 있습니까?


작은 편집, 그냥 조금 더 흥미로 만들려면 :

는 말 인쇄 "same after all..."에

if (i3 <= i4 && i3 >= i4) System.out.println("same after all..."); 

추가.

답변

4

맞습니다. JVM은 작은 값을 autoboxing 할 때 Integer 인스턴스를 "캐시"하고 재사용합니다.

참조 Java 언어 사양 Section 5.1.7 Boxing Conversion :

박스되는 값 p는 true, false, 바이트, 범위의 문자 인 경우 \u0000\u007f, 또는 -128까지의 int 또는 단락 수 및 127이면 r1과 r2를 p의 두 복싱 변환 결과 라합시다. 항상 r1 == r2 인 경우입니다. <, >, <=>=를 사용 Integer S를 비교하면

는 숫자가 해제되어 != 박스 및 == 반대로.

+0

감사합니다. 저는 현재 SCJP를 배우고 있으며 공식 학습 가이드에서 이와 비슷한 예를 발견했습니다. 저자가이 동작에 대해주는 설명은 다릅니다 (분명히 잘못되었습니다). – maciek

+0

@maciek : 정말요? 어떤 소스가 틀렸다고 생각하는지 또는 짧은 발췌 부분을 알려주시겠습니까? –

+0

음, 충분히 신중하게 읽지는 않았습니다. 실제로 텍스트에서이 동작은 Short와 Integer에만 -128과 127 사이에 적용됩니다. 내 잘못 – maciek

2

-127과 127 사이의 정수는 '캐시'되어 동일한 참조를 반환하므로 i1과 i2는 동일한 객체를 가리 킵니다.

+0

미안 범위는 -128에서 127 사이입니다. – Aniruddha