[英]HashSet internally uses hashmap for its implementation, then why is hashmap faster than hashset?
[英]Why is HashMap faster than HashSet?
我一直在阅读/研究HashMap
比HashSet
更快的原因。
我不太了解以下陈述:
HashMap
比HashSet
更快,因为值与唯一键相关联。
在HashSet
,成员对象用于计算哈希码值,对于两个对象,哈希码值可以相同,因此使用equals()
方法检查是否相等。 如果返回false
,则表示两个对象不同。 在HashMap
,使用密钥对象计算哈希码值。
使用密钥对象计算HashMap
哈希码值。 这里,成员对象用于计算哈希码,对于两个对象可以是相同的,因此使用equals()
方法来检查相等性。 如果返回false
,则表示两个对象不同。
总结我的问题:
我认为HashMap
和HashSet
以相同的方式计算哈希码。 他们为什么不同?
你能提供一个具体的例子, HashSet
和HashMap
如何以不同的方式计算哈希码?
我知道什么是“关键对象”,但“成员对象”是什么意思?
HashMap
可以做与HashSet
相同的事情,并且速度更快。 为什么我们需要HashSet
? 例:
HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); map.put("obj1",true); => exist map.get("obj1"); =>if null = not exist, else exist
性能:
如果你看一下HashSet的源代码(至少是JDK 6,7和8),它会在内部使用HashMap,所以它基本上就像你在使用示例代码一样。
因此,如果需要Set实现,则使用HashSet,如果需要Map - HashMap。 使用HashMap而不是HashSet的代码与直接使用HashSet具有完全相同的性能。
选择合适的系列
Map - 将键映射到值(关联数组) - http://en.wikipedia.org/wiki/Associative_array 。
Set - 不包含重复元素的集合 - http://en.wikipedia.org/wiki/Set_(computer_science) 。
如果您需要收集的唯一内容是检查其中是否存在元素 - 请使用Set。 您的代码将更清晰,更易于理解。
如果您需要为元素存储一些数据 - 请使用Map。
这些答案都没有真正解释为什么 HashMap比HashSet更快。 它们都必须计算哈希码,但要考虑HashMap的键的性质 - 它通常是一个简单的字符串,甚至是一个数字。 计算它的哈希码比整个对象的默认哈希码计算快得多。 如果HashMap的键与存储在HashSet中的键相同,那么性能就没有真正的区别。 不同之处在于HashMap的关键是什么类型的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.