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

Luk*_*uth -1 java boxing unboxing boolean

假设我有一个Map<Integer, Boolean>,我想过滤掉所有布尔值为的整数true.这是一些代码:

for (Map.Entry<Integer, Boolean> e : map.entrySet()){
    if (e.getValue() == true){ // Unboxing here
        // Do something useful...
    }
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,Boolean每次执行if时都会将对象取消装箱(如果地图非常大,则可能会出现问题).

现在,Boolean-class提供常量(Boolean.TRUEBoolean.FALSE),它们表示普通的布尔值,true并且false是一个已经装箱的版本(对吧?).因此,使用此代码可以完全避免拆箱:

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

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

Sot*_*lis 5

如果您使用原始boolean文字向地图添加元素,它将起作用.

当使用期望引用类型的原始文字时,编译器将使用Boolean#valueOf(..)实现为

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
Run Code Online (Sandbox Code Playgroud)

返回类型的值Boolean.所以Boolean每次都会得到相同的两个对象.

如果您改为添加到地图中

new Boolean(true) // or new Boolean(false)
Run Code Online (Sandbox Code Playgroud)

它将是一个不同的参考,因此比较==将失败.


这似乎是过早的优化.