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

标签 java boolean boxing unboxing

假设我有一个 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/

相关文章:

设置和获取交集的 MySQL 字符串

java - java将 boolean 数组转换为二进制的方法

c# - 为什么 Int32.ToString() 发出调用指令而不是 callvirt?

c# - 从 C# 表达式中删除不需要的装箱转换

c# - 泛型如何消除或减少装箱的需要?

java - 设置图像中像素的颜色

java - IntelliJ IDEA 2016.3.4 : Abnormal build process termination

java - 使用 jooq 插入间隔数据

java - Java Web 应用程序中的 BMI 计算器

RSpec:如何测试 boolean 返回类型?