![](/img/trans.png)
[英]Is it better to assign Boolean.TRUE/Boolean.FALSE or true/false to a boolean primitive variable?
[英]Does checking against Boolean.TRUE/Boolean.FALSE avoid boxing/unboxing?
假設我有一個Map<Integer, Boolean>
,我想過濾出所有布爾值為true
的整數。 這是一些代碼:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == true){ // Unboxing here
// Do something useful...
}
}
在此代碼中,每次執行if時,都會將Boolean
-object取消裝箱(如果映射很大,可能會出現問題)。
現在, Boolean
-class提供常量( Boolean.TRUE
和Boolean.FALSE
),這些常量將常規布爾值true
和false
為已裝箱的版本( 對嗎? )。 因此,使用此代碼可以避免完全拆箱:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
// Do something useful...
}
}
我對這個假設是否正確? 還是更糟,兩個值都未裝箱以進行比較?
如果您使用原始boolean
文字將元素添加到地圖中,則它將起作用。
當使用期望引用類型的原始文字時,編譯器將使用實現為以下形式的Boolean#valueOf(..)
:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
返回Boolean
類型的Boolean
。 因此,您每次都會獲得相同的兩個Boolean
對象。
如果您改為使用
new Boolean(true) // or new Boolean(false)
它將是一個不同的引用,因此與==
比較將失敗。
這似乎是過早的優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.