假设我有一个叫做的类Number,我打算对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?");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方法有不同的语义:
equals具有Object::equals合同规定的语义,而isEqualTo具有专门适用于Number对象的语义由于比较不是苹果对苹果,因此equals需要更多CPU周期才是公平的.但是,您不太可能注意到这种差异.
像你这样的类实现更为常见Comparable<T>.语义在那里需要进行排序检查,而不仅仅是对于等式检查,但是不需要使用未知类的对象,从而节省CPU周期.
您应该有充分的理由提供相等的替代方法(例如,分析器运行指向equals(Object)瓶颈,由于更改导致可读性的改进,或者由于采用更多的接口而实现更丰富的语义).为了减少几个CPU周期而这样做会过早优化.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |