我应该何时为我的类型定义哈希码函数?

dev*_*ium 8 c# java

除了允许好好使用哈希表之外,还有其他原因为我的类型实现哈希码函数吗?

假设我正在设计一些我打算在内部使用的类型.我知道类型是系统的"内部",我也知道我永远不会在哈希表中使用这些类型.尽管如此,我还是决定重新定义equals()方法.

理论上说我也应该重新定义哈希码方法,但我看不出任何理由,在这种情况下,我应该这样做.

任何人都可以指出任何其他原因吗?

这个问题可以改为:在哪种情况下我们应该在我们的类型中实现哈希码方法.

PS:我不是问如何实施一个.我在问什么时候.

Mar*_*ell 10

可能没有 - 但是您的任何代码都会使用LINQ吗?有许多意外的地方可能会在您的数据上使用散列图或字典.

如果您不想要意外......"有趣",那么如果您改变Equals,请覆盖GetHashCode.同样,任何IEquatable<T>.Equals应该与object.Equals实现相匹配.


Pet*_*ans 6

当然是.hashCode和equals是同一个东西的2个视图,必须保持一致.集合中的许多例程使用哈希码,如果它告诉与等号不同的东西,则会开始行为不端.你可以把"行为不端"看作"非常难以找到导致早期脱发的虫子".

如果重写等于,则必须覆盖哈希码,不是因为指南这样说,而是因为你重视头发(或时间).

现代IDE为您生成良好的equals/hashcode,Java Commons或Spring的EqualsBuilder/HashCodeBuilder可以帮助您轻松实现.Lombok项目即时生成它们.

这是非常严肃的事情,你可以用这些方法做到最好是做对了,有数百种方法做错了,导致痛苦和痛苦.如果您可以避免自己编写,请使用生成器或库来帮助您.