2013-04-23 2 views
-4

Я вижу странную проблему. У меня есть объект, который имеет несколько переменных экземпляра, один из которых является числовым. Этот объект вышел из сокета с помощью readObject() ObjectInputStream, поэтому его нужно было десериализовать. Однако, когда я сравниваю его с другим объектом, который имеет то же самое число для этого поля, используя ==, он не совпадает. Примечание. Я не сравниваю объекты, просто переменную экземпляра integer, используя 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()) 
      } 
    } 

Спасибо Тед Хопп, да, я предполагаю, что поведение непоследовательно Integer сравнения с ==. Я понял, что поля были Integer, а не int, и это работало раньше, поэтому было очень запутанно, почему он больше не работал.

+1

Пожалуйста, укажите код, чтобы мы могли диагностировать. Здесь нечего уходить – 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() либо извлечь примитивные значения (int, long и т.д.) перед использованием ==

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

Спасибо большое! Он работает сейчас. – stumped

0

Печать заявления непосредственно перед сравнением, показывают, что они точно то же самое.

Я думаю, что Алекс Реллим прав. Операторы Print читают метод toString объекта. Вот почему вы видите, что цифры одинаковы. Если вы используете отладчик, проверьте тип объекта.

Редактировать (после вставки кода OP): Это может быть вашей проблемой? Using == operator in Java to compare wrapper objects

Смежные вопросы