【发布时间】:2011-09-09 18:16:14
【问题描述】:
我在整数字段周围有两个简单的包装类,我必须在其中覆盖 equals() 和 hashCode()。最后,它们都使用了相同的 hashCode() 算法,因此如果 Integer 字段相同,则哈希码会发生冲突。
由于对象是不同的类型,这是否重要,或者我是否应该只关心我是否希望将它们作为键混合在同一个 HashMap 中?
【问题讨论】:
标签: java
我在整数字段周围有两个简单的包装类,我必须在其中覆盖 equals() 和 hashCode()。最后,它们都使用了相同的 hashCode() 算法,因此如果 Integer 字段相同,则哈希码会发生冲突。
由于对象是不同的类型,这是否重要,或者我是否应该只关心我是否希望将它们作为键混合在同一个 HashMap 中?
【问题讨论】:
标签: java
hashCode() 对两个对象相等表示“有机会这些对象相等,请通过调用 equals() 仔细查看”。只要这些类的equals() 方法正确,哈希码相同就不是问题。
hashCode() 的一般规则是,如果两个对象相等,它们的哈希码也应该相等。请注意,规则不是“如果两个对象具有相同的哈希码,则它们应该相等。”
【讨论】:
如果您可能有一个哈希映射,其中两种类型的对象具有相同的值,那么这显然是一个潜在的性能问题。 HashMap 之类的不看实际的运行时类 - 实际上没有标准的方法来判断不同类的两个对象是否可以相等(例如,Lists 在ArrayList 和 Arrays.asList 生成的相同顺序应该比较相等)。对于HashMap,我猜命中不会太糟糕,但可能会更糟,例如,在第一次检查中获得成功的探测实现。
【讨论】: