在编写hashcode和equals方法时需要帮助吗?

时间:2011-09-06 06:04:56

标签: java equals hashcode

我有一个课程,提供有关付款的详细信息。属性

    accountNo, transactionAmount, dateOfTransaction.

这里我想编写哈希函数,以便在将这个类对象存储在hashSet中时效率很高。

主要限制因素是付款细节应该是唯一的(假设某个人不应该在一个月内支付两次费用。)

任何人都可以帮助我为hashCode编写这个场景并且也等于方法吗?

3 个答案:

答案 0 :(得分:3)

您需要确定完全您的平等意味着什么。特别是,你谈到不在月支付两次 - 这是否意味着一个交易应该等于另一个交易,如果它在同一个月,即使它是在另一天?这听起来有点奇怪 - 而且非常特定于用途而不是特定类型 - 平等的概念。另请注意,该交易只有一个帐号 - 当然它应该同时包含“来自”和“到”帐户,因为可能会有多个人付款到同一帐户,并且可能在同一个月内从一个帐户付款到多个帐户。

所以,我个人不想以这种方式覆盖平等,但如果你真的必须这样做,那就不难了......一旦你决定了什么构成平等,我就会实现{{1} } - 此时equals通常相当容易。

强烈建议您阅读Josh Bloch关于Effective Java (second edition)中的平等的部分以获取更多详细信息,但hashCode通常看起来像这样:

equals

请注意,对于任何引用类型的字段,您需要确定要在其中应用的相同类型 - 通常您需要调用@Override public boolean equals(Object other) { if (other == null || other.getClass() != this.getClass()) { return false; } BankTransaction otherTransaction = (BankTransaction) other; return accountNo == otherTransaction.accountNo && transactionAmount == otherTransaction.transactionAmount && // etc; } 而不是仅仅使用equals提供的参考比较。

答案 1 :(得分:3)

我建议你使用apache commons包的hashcodebuilder:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/HashCodeBuilder

还有一个EqualsBuilder:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/EqualsBuilder

如果您同时实施,则不必担心将对象存储在哈希集中

答案 2 :(得分:2)

这个问题的最终答案在Effective Java (second edition)