内联的hashCode和Objects.hash之间的性能差异

时间:2018-09-05 11:27:41

标签: java hashcode

一个一般性的问题(可能以前回答过,但我没有找到)。

我更喜欢什么:哈希代码的Josh Bloch实现直接在我的类中或对方法Objects.hash(...)的委派。

Josh Bloch变体的优点:

  • Eclipse中的自动生成
  • 更快(?)

Objects.hash的专业人士

  • 快速手写实现
  • 非言语

是的,我知道Objects.hash在内部使用Josh Bloch的公式。

现在我的问题是:在我的班级中直接执行Josh Bloch公式是否比向Objects.hash进行委派要显着更快?因为Objects.hash要求创建额外的数组以用于参数提交和基元装箱。但是我也知道,JVM为性能优化提供了很多“魔术”,因此我的假设可能不正确(例如,对基元进行缓存可以提高装箱速度)。

相同的问题是否等于:我应该使用自动生成的方法还是应该委派给Arrays.equals

一些代码,以演示如何使用委托来实现这些方法。

import java.util.Arrays;

public class MyObject {

    private int field1;
    private String field2;
    private long field3;

    // use special method to grant that the both equals and hashCode 
    // are changed when a field is added or removed.
    private Object[] data() {
        return new Object[] {field1, field2, field3};
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof MyObject) {
            return Arrays.equals(data(), ((MyObject) obj).data());
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(data());
    }
}

0 个答案:

没有答案