gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:15:31 25 4
gpt4 key购买 nike

假设我有一个 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.TRUEBoolean.FALSE ),它们表示正常的 boolean 值 truefalse作为已经盒装的版本(对吗?)。因此,使用此代码可以避免完全拆箱:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com