检查Boolean.TRUE / Boolean.FALSE是否可以避免装箱/拆箱?

时间:2014-03-15 16:23:05

标签: java boolean 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 - 对象(如果地图非常大,可能会出现问题)。

现在,Boolean - 类提供常量(Boolean.TRUEBoolean.FALSE),它们表示正常的布尔值truefalse已作为已装箱版本(对吗?)。因此,使用此代码可以避免完全取消

for (Map.Entry<Integer, Boolean> e : map.entrySet()){
    if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
        // Do something useful...
    }
}

我对这个假设是对的吗?或者更糟糕的是,两个值都是未装箱的比较?

1 个答案:

答案 0 :(得分:5)

如果您使用原始boolean文字向地图添加元素,则会有效。

当使用需要引用类型的原始文字时,编译器将使用{/ 1}}实现为

Boolean#valueOf(..)

返回public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } 类型的值。因此,每次都会得到相同的两个Boolean个对象。

如果您改为使用

添加到地图中
Boolean

它将是一个不同的参考,因此与new Boolean(true) // or new Boolean(false) 的比较将失败。


这似乎是过早的优化。