当String只由数字组成时,我应该如何覆盖hashCode?

时间:2015-05-16 14:31:42

标签: java string hashcode

我有这堂课:

public class Person {
    private String id;

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Person &&
            this.id.equals(((Person) obj).id);
    }

    @Override
    public int hashCode() {
        ...
    }
}

字段id仅由数字组成。我的问题是,hashCode方法应该是这样的:

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

或者这个:

@Override
public int hashCode() {
    return Integer.parseInt(id);
}

提供id <= Integer.MAX_VALUE

2 个答案:

答案 0 :(得分:2)

您应该将其保留为字符串的hashCode。

这有几个原因:

  1. String.hashCode()会在更多整数空间上分配哈希,而不仅仅是返回Integer.parseInt
  2. String会缓存哈希码,因此在每次调用Integer.parseInt
  3. 时都不会支付hashCode()的费用

    我在这里做的关键假设是你的id的值范围是'1' - '9999999',即不包括负整数,可能不包括 all 整数,否则你将无法添加新的id。

答案 1 :(得分:1)

委派所有对象的哈希码,包括在这种情况下。对于某些假设的性能问题,不值得使代码变得复杂,并且在这种特殊情况下,它会适得其反,因为标准实现会缓存哈希码。