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.TRUE和Boolean.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)
我对这个假设是对的吗?或者更糟糕的是两个值都是未装箱的比较?
如果您使用原始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)
它将是一个不同的参考,因此比较==将失败.
这似乎是过早的优化.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |