[英]Different results with Boolean and boolean in java
我的代碼未給出正確的結果,我開始進行故障排除並發現了一個奇怪的錯誤,有人可以向我解釋一下。
如果我選擇字段並執行此操作,結果將為result1 == false和result2 == true,為什么?
MyClass m1 = new MyClass();
MyClass m2 = new MyClass();
Field[] fieldsFirst = m1.getClass().getDeclaredFields();
Field[] fieldsSecond = m2.getClass().getDeclaredFields();
for (int i = 0; i < fieldsFirst.length; i++) {
Field first = fieldsFirst[i];
Field second = fieldsSecond[i];
first.setAccessible(true);
second.setAccessible(true);
if(first.get(m1) instanceof Boolean)
{
boolean b1 = (Boolean)first.get(m1);
boolean b2 = (Boolean)second.get(m2);
//Here are the results
boolean result1 = b1 != b2; // false
boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2); // true
}
如果我有:
public class MyClass {
private boolean myBoolean = true;
public boolean getMyBoolean()
{
return myBoolean;
}
public void setMyBoolean(booelan inBool)
{
myBoolean = inBool;
}
}
在
boolean result1 = b1 != b2; // false
您正在比較原始值,因為b1
和b2
是從Boolean
到boolean
拆箱轉換結果。
在
boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2); // true
您正在比較參考。 每個get()
的結果引用了一個不同的對象。 因此, !=
比較為true
。
Boolean
是原始boolean
的包裝。
包裝器類將數據類型包裝(封裝)並賦予其對象外觀。 在任何需要數據類型作為對象的地方,都可以使用此對象。 包裝器類包括解包裝對象並返回數據類型的方法。
來源: http : //way2java.com/java-lang/wrapper-classes/
與其他對象一樣,如果需要比較它們的值,則需要使用.equals()
而不是比較運算符。
這里:
boolean b1 = (Boolean)first.get(m1);
boolean b2 = (Boolean)second.get(m2);
您正在將Boolean
轉換為boolean
。 這稱為unboxing conversion
,這是“ AutoBoxing Conversions
的一部分。 這些之所以稱為“ Auto
是因為Java會自動為您進行轉換。 即使您擺脫了演員表。
因此,您正在比較它們的原始值。
由於原始值相同,因此您的比較結果為true。 因此, false
這里:
boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2);
您正在比較兩個對象的引用。 由於它們存儲在不同的存儲位置,因此比較結果為true
。 直觀,不是嗎? 不同的對象,不同的內存位置? 。
如果您確實需要比較兩個對象的值,請使用equals()
方法。 但是,對於Wrapper
對象,請閉上眼睛,將其拆箱為其原始值,然后進行比較。
就像喬什·布洛赫(Josh Bloch)在《有效的Java: 比較包裝程序》中所建議的那樣? 開箱吸盤!
比較有效的Java而言,如果比較運算符具有大於或小於的附加符號,則適用於Wrapper
類。 <
, <=
, >
, >=
產生正確的結果,即使您未取消裝箱。 ==
和!=
不會產生正確的結果
比較boolean result1 = b1 != b2
是原始值比較,因此您可以使用==或!=之類的運算符。
比較boolean result2 = (Boolean)first.get(m1) != (Boolean)second.get(m2)
是對象比較,因此您不是在比較值,而是在引用。 您應該使用equals()比較它們
像boolean result2 = ((Boolean)first.get(m1)).equals((Boolean)second.get(m2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.