【问题标题】:Implement Comparator for primitive boolean type?为原始布尔类型实现比较器?
【发布时间】:2012-11-05 09:52:38
【问题描述】:

我需要一些类implements Comparator,其中一个我想比较原始boolean(不是Boolean)值。

如果它是一个 Boolean,我会只使用 return boolA.compareTo(boolB);,它会返回 0、-1 或 1。但是我如何使用原语来做到这一点?

【问题讨论】:

  • 你听说过自动装箱吗?
  • @stackmonster 自动装箱对性能有轻微影响,因此 OP 可能仍然更喜欢编写原始代码。
  • 比较器不采用原始类型。这就是问题所在。
  • @MarkoTopolnik 由于每个可能的boolean 对象都被缓存,自动装箱可能不会像您预期的那样花费太多。注意:每个可能的byte 也会被缓存。
  • @PeterLawrey 是的,我考虑到了这一点。命中非常轻微(必须取消引用 Boolean 常量)并且可能不值得额外的代码。

标签: java comparator primitive-types


【解决方案1】:

从 Java 7 开始,Marko Topolnik showed in his answer 的逻辑已经转移到另一个方法中,以公开一种比较原始 boolean 的方法。

Javadoc for Boolean.compare(boolean x, boolean y):

public static int compare(boolean x, boolean y)

Compares two boolean values. The value returned is identical to 
what would be returned by:

    Boolean.valueOf(x).compareTo(Boolean.valueOf(y))

【讨论】:

  • 总而言之,即使是 JDK 现在也通过自动装箱来做到这一点(截至 7)。
  • @PriiduNeemre:不,不是。源代码是这样的(至少在 Java 8 中): public static int compare(boolean x, boolean y) { return (x == y) ? 0 : (x ? 1 : -1); }
  • @PriiduNeemre 是的,Wim Deblauwe 是正确的。 Javadoc 指出,如果您将它们作为对象进行比较,则它与结果相同。如果你看Marko Topolnik's和Oracle JDK中的源代码,你会发现Oracle的实现是一样的。
【解决方案2】:

您可以查看它是如何为 java.lang.Boolean 实现的,因为该类自然也使用原始布尔值:

public int compareTo(Boolean b) {
    return (b.value == value ? 0 : (value ? 1 : -1));
}

从 Java 7 开始,您可以简单地使用内置的静态方法 Boolean.compare(a, b)

【讨论】:

  • 或者你可以简单地使用 Boolean.valueof(boolean)。
  • 你想到了Boolean.valueOf(a).compareTo(Boolean.valueOf(b))吗?这很拗口,而且比使用Boolean.compare(a, b) 慢。
【解决方案3】:

Boolean-Adapter 类的更好方法和正确使用

public int compare(boolean lhs, boolean rhs) {
    return Boolean.compare(lhs, rhs);
}

编辑:

提示:这首先对“假”值进行排序。如果你想反转排序使用:

(-1 * Boolean.compare(lhs, rhs))

【讨论】:

  • 或者你可以简单地这样做Boolean.compare(rhs, lhs)
【解决方案4】:

您可以使用 java 的自动装箱功能来缓解这个问题。您可以在此处阅读有关自动装箱的信息:Java autoboxing

【讨论】:

    【解决方案5】:

    您可以通过以下方式比较两个原始布尔值 b1 和 b2。

    (Boolean.valueOf(b1).equals(Boolean.valueOf(b2))

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 2019-05-28
      • 2021-12-06
      • 2021-02-01
      • 1970-01-01
      • 2012-02-22
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多