这个hashCode方法会溢出吗?

时间:2015-11-02 05:01:31

标签: java android hashcode

我正在编写一个具有Achievement系统的Android应用程序,类似于Stack Overflow的徽章。我也使用Sugar ORM存储成就'数据库的进展。这是成就`类:

public class Achievement extends SugarRecord<Achievement>{
    @StringRes
    public int shortNameId;
    @StringRes
    public int descriptionId;
    public int progressNow;
    public int fullProgress; 
    //I am afraid that Sugar ORM will ignore private fields 
    //so I made them public. Please tell me if Sugar ORM does
    //not ignore those.
}

现在我要覆盖类中的hashCode方法。根据 Effective Java 第2版,我实现了这样:

@Override
public int hashCode () {
    int result = 17;
    result = result * 31 + shortNameId;
    result = result * 31 + descriptionId;
    result = result * 31 + fullProgress;
    return result;
}

然后我查看生成的R.java以查看字符串resid是什么(我只是好奇)。我意识到他们是相当大的数字。在hashCode方法中,我将result乘以31,3次,这已经很大了。现在我将非常大的资源ID添加到它。我担心结果值会超过Integer.MAX_VALUE

你能告诉我我的hashCode方法是否会溢出吗?如果是这样我该怎么办?

1 个答案:

答案 0 :(得分:2)

没关系。整数溢出不会产生异常或其他错误,它只是从MIN_VALUE回绕。 hashCode()的唯一有用特征(除了等式要求)是它以不同的方式展开以用于不同的值。负哈希码很好。 (事实上​​,Integer#hashCode()只是int值。)