【问题标题】:Does checking against Boolean.TRUE/Boolean.FALSE avoid boxing/unboxing?检查 Boolean.TRUE/Boolean.FALSE 是否避免装箱/拆箱?
【发布时间】:2014-03-16 00:27:58
【问题描述】:

假设我有一个Map<Integer, Boolean>,我想过滤掉所有布尔值为true 的整数。这是一些代码:

for (Map.Entry<Integer, Boolean> e : map.entrySet()){
    if (e.getValue() == true){ // Unboxing here
        // Do something useful...
    }
}

在这段代码中,Boolean-object 在每次执行 if 时都会被拆箱(如果映射非常大,这可能会出现问题)。

现在,Boolean 类提供了常量(Boolean.TRUEBoolean.FALSE),它们将普通布尔值 truefalse 表示为已装箱的版本(对吗?)。所以使用这段代码可以避免拆箱完全

for (Map.Entry<Integer, Boolean> e : map.entrySet()){
    if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
        // Do something useful...
    }
}

我对这个假设是否正确?或者更糟糕的是,两个值都被拆箱以进行比较?

【问题讨论】:

  • 你看过开箱码了吗? booleanValue() { return value; },其中value 是在构造函数中设置的private final boolean。换句话说,这是一种超快速的方法,如果需要可以内联。我不会费心尝试手动优化它。

标签: java boolean boxing unboxing


【解决方案1】:

如果您使用原始 boolean 文字向地图添加元素,它将起作用。

在需要引用类型的地方使用原始文字时,编译器将使用实现为的Boolean#valueOf(..)

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

返回Boolean 类型的值。所以你每次都会得到相同的两个Boolean对象。

如果您改为添加到地图中

new Boolean(true) // or new Boolean(false)

这将是一个不同的引用,因此与== 的比较将失败。


这似乎是过早的优化。

【讨论】:

  • 这是过早的优化,这更多是出于兴趣而不是出于性能原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多