我一直在研究Java集合框架的源码,并注意到
我知道
"如果更改对象的值以影响等价比较,则不指定集合的行为"
和
"如果更改对象的值以影响等价比较,则不指定Map的行为"
这些契约使得可能根据其状态返回不同哈希值的对象在集合中使用危险,并且作为映射中的键使用也存在同样的问题。这让我想到了以下问题:
1. 返回可变哈希值是否有意义? 2. 如果返回每个对象类的常数哈希值不是更好吗? 3. 除了在哈希集合中使用之外,
AbstractList
和 AbstractMap
将其元素的哈希值之和作为它们自己的哈希值返回。这使得List和Map实现将根据集合内容返回不同的哈希值。我知道
hashCode()
方法的唯一用途是对使用哈希的数据结构中的元素进行均匀分布,例如HashSet
和HashMap
。然而,Set
和Map
的契约规定如下:"如果更改对象的值以影响等价比较,则不指定集合的行为"
和
"如果更改对象的值以影响等价比较,则不指定Map的行为"
这些契约使得可能根据其状态返回不同哈希值的对象在集合中使用危险,并且作为映射中的键使用也存在同样的问题。这让我想到了以下问题:
1. 返回可变哈希值是否有意义? 2. 如果返回每个对象类的常数哈希值不是更好吗? 3. 除了在哈希集合中使用之外,
hashCode()
方法还有什么用处?