2013-04-23 62 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