gpt4 book ai didi

java - 提供 equals() 的替代方案吗?

转载 作者:行者123 更新时间:2023-12-03 00:10:08 26 4
gpt4 key购买 nike

假设我有一个名为 Number 的类(class),我打算对 Number 进行大量相等比较对象。我担心通用 Number::equals(Object o) 的“开销”(类比较等...)方法。在这种情况下,提供诸如Number::isEqualTo(Number other)之类的方法是否有用?作为Number::equals(Object o)的替代品?这是常见的模式吗?或者 JVM 目前的优化是否足够好,以至于这样做没有任何优势?

这是一个代码示例:

public class Number {
int _value;

Number(int value) {
_value = value;
}

@Override
public boolean equals(final Object o) {
if (o == this) return true;
if (o == null) return false;
if (o.getClass() != getClass()) return false;
return isEqualTo((Number)o);
}

public boolean isEqualTo(final Number other) {
return _value == other._value;
}

public static void main(String[] args) {
Number one = new Number(1);
Number two = new Number(2);
if (!one.isEqualTo(two)) {
System.out.println("fast comparison?");
}
if (!one.equals(two)) {
System.out.println("slow comparison?");
}
}
}

最佳答案

这两种方法具有不同的语义:

  • equals具有 Object::equals 规定的语义契约(Contract),同时
  • isEqualTo具有专门适用于 Number 的语义对象

由于比较不是同类比较,所以 equals 是公平的需要更多的CPU周期。但是,您不太可能注意到其中的差异。

对于像您这样的类来说,实现 Comparable<T> 更为常见。 。那里的语义要求进行排序检查,而不仅仅是相等检查,而且不需要获取未知类的对象,从而可以节省 CPU 周期。

您应该有充分的理由提供相等性的替代方案(例如,分析器运行指向 equals(Object) 作为瓶颈,由于更改而导致可读性的明显改进,或者由于采用以下接口(interface)而实现更丰富的语义做更多)。为了减少一些 CPU 周期而这样做会导致优化过早。

关于java - 提供 equals() 的替代方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479702/

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