2013-04-23 59 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()) 
      } 
    } 

感谢特德霍普,是的,我想行为是不一致的整数与==比较。我意识到这些字段是整数,而不是整数,并且它以前工作过,所以非常困惑为什么它不再有效。

+1

请提供代码,以便我们可以诊断之前提取的原始值(intlong等)。没有什么可以离开这里 – torquestomp 2013-04-23 00:43:07

+0

'=='只是比较对象的引用和其他。你需要实现一个'obj1.equals(obj2)'方法来比较内部数据。 – Supericy 2013-04-23 00:43:41

+0

这可能是你的问题吗? http://stackoverflow.com/questions/10149959/using-operator-in-java-to-compare-wrapper-objects – sarahTheButterFly 2013-04-23 00:54:59

回答

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 2013-04-23 00:57:01

0

打印报表,表明他们说的完全 相同。

我认为Alex Rellim是正确的。 Print语句读取对象的toString方法。这就是为什么你看到数字是相同的。如果您使用调试器,请检查对象的类型。

编辑(在OP的代码被粘贴之后):这可能是你的问题吗? Using == operator in Java to compare wrapper objects