假设我有一个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.TRUE
和Boolean.FALSE
),它们表示正常的布尔值true
和false
已作为已装箱版本(对吗?)。因此,使用此代码可以避免完全取消 :
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
// Do something useful...
}
}
我对这个假设是对的吗?或者更糟糕的是,两个值都是未装箱的比较?
答案 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)
的比较将失败。
这似乎是过早的优化。