2013-04-23 6 views
-4

이상한 문제가 있습니다. 객체가 하나 있는데, 인스턴스 변수 중 하나는 숫자입니다. 이 객체는 ObjectInputStream의 readObject()를 사용하여 소켓에서 나왔기 때문에 직렬화가 해제되어 있어야합니다. 그러나, 그 필드에 대해 정확히 같은 숫자를 가진 다른 오브젝트와 비교할 때 ==를 사용하면 일치하지 않습니다. 참고 : 객체를 비교하지 않고 정수 인스턴스 변수 만 getter를 사용하여 비교합니다. 비교 직전에 진술서를 인쇄하면 정확히 동일하다는 것을 알 수 있습니다.Java : 일치하는 숫자가 일치하지 않습니다.

System.out.println("New book id:"+newBook.getId()); 
for (Book p: listOfBooks) { 
    System.out.println("CurrentBook's id:"+p.getId()); 
    if (newBook.getId() == p.getId()) { 
     System.out.println("Matched CurrentBook's id:"+p.getId()) 
      } 
    } 

감사합니다. Ted Hopp, 네, 동작이 ==와 정수 비교시 일치하지 않는 것 같습니다. 필드가 int가 아닌 Integer이고 이전에는 작동 했으므로 더 이상 작동하지 않는 이유가 매우 혼란 스러웠습니다.

+1

코드를 입력하십시오 사용하기 전에 원시 값 (int, long 등)을 추출한다. 여기서 벗어날 것이 아무것도 없다. – torquestomp

+0

'=='그냥 객체의 참조를 다른 것과 비교하는 것이다. 내부 데이터를 비교하려면'obj1.equals (obj2)'메소드를 구현해야한다. – Supericy

+0

이것이 문제가 될 수 있습니까? http://stackoverflow.com/questions/10149959/using-operator-in-java-to-compare-wrapper-objects – sarahTheButterFly

답변

3

숫자 개체 (Integer 등)를 ==과 비교하면 일치하지 않는 결과가 발생할 수 있습니다. 예를 들어, Integer은 -128에서 +127 사이의 모든 값을 캐시 된 값에 자동 저장하지만 구현에 따라 해당 범위를 벗어난 값이 캐싱되거나 캐싱되지 않을 수 있습니다. 따라서,

Integer.valueOf(-45) == Integer.valueOf(-45) 

true 수 있지만

Integer.valueOf(-145) == Integer.valueOf(-145) 

은 일반적으로 false 될 것입니다.

숫자 수량의 경우, .equals()를 사용해야 하나 또는 다른 우리가 진단 할 수 있도록 ==

num1.intValue() == num2.intValue() 
+0

대단히 감사합니다 !! 이제 작동합니다. – stumped

0

인쇄 문에 캐스팅해야 그들이 정확히 같은 걸 보여 개체를 반환합니다.

나는 Alex Rellim이 옳다고 생각한다. 그리고 Print 문은 객체의 toString 메서드를 읽습니다. 그래서 숫자가 같음을 알 수 있습니다. 디버거를 사용하는 경우 객체의 유형을 확인하십시오.

편집 (OP 코드를 붙여 넣은 후) : 문제가 될 수 있습니까? Using == operator in Java to compare wrapper objects

관련 문제