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内)?
答案 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)支持。