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 次 |
最近记录: |