-4

我看到一个奇怪的问题。我有一个对象,它有几个实例变量,其中一个是数字的。这个对象是使用 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,是的,我猜对于与 == 进行整数比较的行为是不一致的。我意识到这些字段是整数,而不是整数,并且它以前有效,所以很困惑为什么它不再有效。

4

3 回答 3

3

比较数字对象(Integer等)使用==会产生不一致的结果。Integer例如,会将 -128 到 +127 之间的所有值自动装箱为缓存值,但超出该范围的值可能会或可能不会被缓存,具体取决于实现。因此,

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

true,但是

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

通常会false

对于数字量,您应该在使用之前使用.equals()或提取原始值(intlong等)==

num1.intValue() == num2.intValue()
于 2013-04-23T00:49:54.317 回答
0

在比较之前打印语句,表明它们完全相同。

我认为亚历克斯·雷利姆是对的。Print 语句读取对象的 toString 方法。这就是为什么你看到的数字是一样的。如果您使用调试器,请检查对象的类型。

编辑(在粘贴 OP 的代码之后):这可能是您的问题吗? 在 Java 中使用 == 运算符比较包装器对象

于 2013-04-23T00:49:47.410 回答
0

readObject() 返回一个对象,因此请务必将其转换为 int

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

于 2013-04-23T00:45:07.230 回答