假设我有一个 Map<Integer, Boolean>
我想过滤掉所有 boolean 值为 true
的整数。这是一些代码:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == true){ // Unboxing here
// Do something useful...
}
}
在此代码中,Boolean
- 每次执行 if 时都会对对象进行拆箱(如果 map 真的很大,这可能会出现问题)。
现在,Boolean
-class 提供常量( Boolean.TRUE
和 Boolean.FALSE
),它们表示正常的 boolean 值 true
和false
作为已经盒装的版本(对吗?)。因此,使用此代码可以避免完全拆箱:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
// Do something useful...
}
}
我的这个假设正确吗?或者情况更糟,两个值都被拆箱进行比较?
最佳答案
如果您使用原始的 boolean
文字将元素添加到 map 中,它将起作用。
当在需要引用类型的地方使用原始文字时,编译器将使用 Boolean#valueOf(..)
实现为
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
返回Boolean
类型的值。因此,您每次都会得到相同的两个 Boolean
对象。
如果您使用以下方式添加到 map
new Boolean(true) // or new Boolean(false)
这将是一个不同的引用,因此与 ==
的比较将失败。
这看起来确实是不成熟的优化。
关于java - 检查 Boolean.TRUE/Boolean.FALSE 是否可以避免装箱/拆箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22426426/