What makes good hash keys ?
Classes which are immutable and implement
Important Points
Classes which are immutable and implement
hashCode()
and equals()
sensibly, make good hash keys.
Important Points
- if two objects are equal according to the
equals()
method, they must have the samehashCode()
value (although the reverse is not generally true). - Under this default implementation, two references are equal only if they refer to the exact same object.
Why does our root object class need
hashCode()
, when its discriminating ability is entirely subsumed by that of equals()
?
The
hashCode()
method exists purely for efficiency. The Java platform architects anticipated the importance of hash-based collection classes -- such as Hashtable
, HashMap
, and HashSet
-- in typical Java applications, and comparing against many objects with equals()
can be computationally expensive. Having every Java object support hashCode()
allows for efficient storage and retrieval using hash-based collections.
The hashmap has a number of "buckets" which it uses to store key-value pairs in. Each bucket has a unique number - that's what identifies the bucket. When you put a key-value pair into the map, the hashmap will look at the hash code of the key, and store the pair in the bucket of which the identifier is the hash code of the key. For example: The hash code of the key is 235 -> the pair is stored in bucket number 235. (Note that one bucket can store more then one key-value pair).
When you lookup a value in the hashmap, by giving it a key, it will first look at the hash code of the key that you gave. The hashmap will then look into the corresponding bucket, and then it will compare the key that you gave with the keys of all pairs in the bucket, by comparing them with
equals()
.
Now you can see how this is very efficient for looking up key-value pairs in a map: by the hash code of the key the hashmap immediately knows in which bucket to look, so that it only has to test against what's in that bucket.
Looking at the above mechanism, you can also see what requirements are necessary on the
hashCode()
and equals()
methods of keys:- If two keys are the same (
equals()
returnstrue
when you compare them), theirhashCode()
method must return the same number. If keys violate this, then keys that are equal might be stored in different buckets, and the hashmap would not be able to find key-value pairs (because it's going to look in the same bucket). - If two keys are different, then it doesn't matter if their hash codes are the same or not. They will be stored in the same bucket, but the hashmap will use
equals()
to tell them apart.
Reference :
Most important thing to know about HashMap is it’s data structures and algorithms used to write this class. As name of class(HashMap) is indicating that its works on hashing mechanism. This class basically uses two data structures, one is Array and other is Linked-List. HashMap internally create Array of Entry type objects. Entry is an inner class used by HashMap to stores Key and Value type’s objects. To place an Entry object in array, we need an index at which that object can store in array. This index is generated by hash code of key object provide by user. Hash code of key object can get by hashCode() method of key object. After knowing index, Entry object can place in array. These array indexes are known as bucket. Now if you want to retrieve any object from HashMap, you need to provide key for that. This is key object gives hash code, this hash code generates an index and now at this index you have your object.
ReplyDeleteIf you want to read more about HashMap [Click Here]
http://www.somanyword.com/2013/11/how-do-hashmap-class-works-in-java/