【发布时间】:2016-09-20 14:59:32
【问题描述】:
我一直在浏览 Java Collections 框架的源代码,并注意到 AbstractList 和 AbstractMap 将它们元素的哈希码之和作为它们自己的哈希码值返回。这使得 List 和 Map 实现根据集合的内容返回不同的哈希码值。
我知道hashCode() 方法的唯一用途是将元素均匀分布到使用散列的数据结构内的存储桶中,例如HashSet 和 HashMap。但是,Set 和 Map 合约指定:
如果对象的值以影响相等比较的方式更改,而对象是集合中的一个元素,则不指定集合的行为。
和:
如果对象的值以影响等于比较的方式更改,而对象是映射中的键,则不指定映射的行为。
这些合约使可能根据状态返回不同哈希值的对象在集合中使用和作为映射中的键是危险的。这让我想知道:
- 返回变量哈希值有什么意义吗?
- 返回一个常量(每个对象类)哈希值不是更好吗?
-
hashCode()方法除了用于哈希集合还有什么用途?
【问题讨论】:
-
拥有一个对象的常量哈希码会违反它的contract。例如,如果您在第一次调用时将哈希码锁定为一个值,那么两个相等的不同实例可能具有不同的哈希码。
-
@resueman,是的,但是您可以在实例化时在构造函数中生成它,就像对 String 对象所做的那样。
-
您仍然会遇到同样的问题。具有不同哈希码的两个对象可以修改为彼此相等。
-
@resueman,抱歉我不清楚:我的意思是你需要根据最终字段生成它,所以哈希不会改变。