哈希码是用来加速集合中的对象查找吗?

时间:2017-10-03 04:21:23

标签: java jpa

IIUC它可以将两个相同类型的不同对象存储在HashSet中,即使两个对象在调用hashCode()时返回相同的值。例如,根据this article“Aa”和“BB”返回相同的hashcode(2112),但显然我可以将这两个字符串放在HashSet中并且它们都将被包含在Set没有“Aa”覆盖“BB”。

那么hashCode()的主要目的是在一般情况下更快地在一个集合或集合中查找实例吗?这也意味着,如果我们为hashCode()返回一个常量,这会降低存储此类对象的集合的性能(在JPA context as suggested by this linked article for example内)?

1 个答案:

答案 0 :(得分:2)

是。 任何基于桶的算法的基础是您希望将元素均匀地分布在N个桶中,其中N << |all elements|。 拥有一个常量hashCode会强制所有元素进入同一个存储桶,减少所有查找/包含操作,只使用底层(每桶)结构运行,可以是List或某些。

有关一般性解释,请参阅https://en.wikipedia.org/wiki/Hash_table#Choosing_a_hash_function。现在,Java HashSet仅由HashMap(来自Javadoc)(https://en.wikipedia.org/wiki/Hash_table#Sets)支持。