我看到一个奇怪的问题。我有一个对象,它有一些实例变量,其中一个是数字。这个对象来自使用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,并且它之前有效,所以非常混淆为什么它不再起作用。
答案 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