问题
I have been reading/researching the reason why HashMap
is faster than HashSet
.
I am not quite understanding the following statements:
HashMap
is faster thanHashSet
because the values are associated to a unique key.In
HashSet
, member object is used for calculating hashcode value which can be same for two objects soequals()
method is used to check for equality. If it returnsfalse
, that means the two objects are different. InHashMap
, the hashcode value is calculated using the key object.The
HashMap
hashcode value is calculated using the key object. Here, the member object is used to calculate the hashcode, which can be the same for two objects, soequals()
method is used to check for equality. If it returnsfalse
, that means the two objects are different.
To conclude my question:
I thought
HashMap
andHashSet
calculate the hashcode in the same way. Why are they different?Can you provide a concrete example how
HashSet
andHashMap
calculating the hashcode differently?I know what a "key object" is, but what does it mean by "member object"?
HashMap
can do the same things asHashSet
, and faster. Why do we needHashSet
? Example:HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); map.put("obj1",true); => exist map.get("obj1"); =>if null = not exist, else exist
回答1:
Performance:
If you look at the source code of HashSet (at least JDK 6, 7 and 8), it uses HashMap internally, so it basically does exactly what you are doing with sample code.
So, if you need a Set implementation, you use HashSet, if you need a Map - HashMap. Code using HashMap instead of HashSet will have exactly the same performance as using HashSet directly.
Choosing the right collection
Map - maps keys to values (associative array) - http://en.wikipedia.org/wiki/Associative_array.
Set - a collection that contains no duplicate elements - http://en.wikipedia.org/wiki/Set_(computer_science).
If the only thing you need your collection for is to check if an element is present in there - use Set. Your code will be cleaner and more understandable to others.
If you need to store some data for your elements - use Map.
回答2:
None of these answers really explain why HashMap is faster than HashSet. They both have to calculate the hashcode, but think about the nature of the key of a HashMap - it is typically a simple String or even a number. Calculating the hashcode of that is much faster than the default hashcode calculation of an entire object. If the key of the HashMap was the same object as that stored in a HashSet, there would be no real difference in performance. The difference comes in the what sort of object is the HashMap's key.
来源:https://stackoverflow.com/questions/16278995/why-is-hashmap-faster-than-hashset