2012-08-30 2 views
5

가능한 중복 :
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?예기치 않은 결과 때 비교의 int

나는 다음과 같은 경우에 두 가지의 int를 비교하기 위해 노력하고있어 예상치 못한 결과가

  1. 내가 그랬을 때 wing, @@@이 인쇄되었습니다.

    class C { 
        static Integer a = 127; 
        static Integer b = 127; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    
  2. @@@은 인쇄되지 않았습니다.

    class C { 
        static Integer a = 145; 
        static Integer b = 145; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    

는 사람이 이유가 될 수 있는지 말해 줄 수.

+0

사람이 ... [정수 래퍼 객체의 – Rookie

+4

가능한 중복 단지 내에서 동일한 인스턴스를 공유 할 수 it..I이 할 수없는 오전 포맷 할 수 있다면 값 127?] (http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances-only-within-thevalue-127) 및 [New Integer vs valueOf] (http://stackoverflow.com/questions/2974561) 및 [Java의 일관되지 않은 동작 ==] (http://stackoverflow.com/questions/1148805) 및 [Integer 래퍼 개체가 값 127 내에있는 동일한 인스턴스를 공유합니까?] (http://stackoverflow.com/questions/5117132) 및 ... –

+2

자세한 내용은 http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html –

답변

8

개체의 ID를 비교하고 있습니다. 값이 128보다 작은 경우 Integer 클래스는 해당 객체를 캐시합니다. 이것이 첫 번째 예에서 동등한 이유입니다. 다른 예는 캐시되지 않은 높은 값입니다.

@niklon은 캐싱을 위해 더 낮은 경계 인 -128도 지적했습니다.

위쪽 테두리는 VM arg -Djava.lang.Integer.IntegerCache.high=4711으로 조정할 수 있습니다. 피터의 흥미로운 블로그 게시물에서

추가 읽기 : http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

+0

다른 모든 래퍼 클래스에서도 이런 일이 발생합니까? –

+1

그건 그렇고, 정수 캐싱의 하한은 -128입니다. – niklon

+1

@niklon 이것은 구현 세부 사항입니다. [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29)에는 "이 방법은 항상 -128 ** ** " –

5

당신은 int을 비교하지 않습니다. 참조 평등을 위해 개체를 비교하고 있습니다. .equals을 사용하거나 Object 대신 int 유형을 사용하십시오.

+1

/첫 번째 경우에는 왜 "@@@"로 인쇄됩니까? – Rookie

+2

@ Raghav, 많은 Java 버전 [작은 Integer's를 메모하기] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) : "이 메서드는 항상 -128에서 127 범위의 값을 캐시하며이 범위 밖의 다른 값을 캐시 할 수 있습니다." –

1

여기서는 int 프리미티브가 아닌 Integer 개의 개체를 사용하고 있습니다. 따라서 두 인스턴스를 .equals(...)으로 비교하고 ==과 비교해야합니다. 대신 기본 유형을 사용하면 ==을 사용합니다.

개체를 처리 할 때 ==은 실제 값이 아닌 참조과 두 개체의 참조를 비교하므로 때때로 겉으로보기에는 이상한 결과를 반환 할 수 있습니다.

1

사용 if(a.equals(b)) 및 객체 클래스의 서브 클래스 객체를 비교하는 ==를 사용하지 마십시오.

== 운영자가 INT, 길이 등과 같은 기본 형식만을위한 것은

관련 문제