簡體   English   中英

是否檢查Boolean.TRUE / Boolean.FALSE可以避免裝箱/拆箱?

[英]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.TRUEBoolean.FALSE ),這些常量將常規布爾值truefalse為已裝箱的版本( 對嗎? )。 因此,使用此代碼可以避免完全拆箱:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM