我正在编写一个具有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
方法是否会溢出吗?如果是这样我该怎么办?
答案 0 :(得分:2)
没关系。整数溢出不会产生异常或其他错误,它只是从MIN_VALUE
回绕。 hashCode()
的唯一有用特征(除了等式要求)是它以不同的方式展开以用于不同的值。负哈希码很好。 (事实上,Integer#hashCode()
只是int
值。)