Java:相等的数字不匹配

时间:2013-04-23 00:41:58

标签: java

我看到一个奇怪的问题。我有一个对象,它有一些实例变量,其中一个是数字。这个对象来自使用ObjectInputStream的readObject()的套接字,所以它应该被反序列化。但是,当我将它与另一个具有完全相同的字段的对象进行比较时,使用==,它不匹配。注意:我不使用getter比较对象,只是整数实例变量。在比较之前打印语句,表明它们完全相同。

    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,是的,我猜这个行为与Integer与==的比较是不一致的。我意识到这些字段是Integer,而不是int,并且它之前有效,所以非常混淆为什么它不再起作用。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

readObject()返回一个对象,所以一定要把它强制转换为int

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()

答案 2 :(得分:0)

  

在比较之前打印报表,表明它们是完全正确的   同样的。

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

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