How HashMap works in Java ?
I will explain put and get operation done in HashMap in
pictorial representation so that you will get clear idea what
exactly happens inside.
What is HashMap ?
HashMap is in the java.util package. This package provides
lot of inbuilt data structure so the we need not to implement it by our own.
So maps are associated arrays that let programmer stores
the key-value pairs. We need key and value to store in the hash map and later on
we need that key to look for the stored value in the hash map.
HashMap is the implementation of the Map interface. It is
based on a function called Hashing.
Hashing is a technique by which you can short a big length
String or Object into a fixed length number or representation. Eg, a long
string, hashing can convert this string in a number.That helps in indexing and faster lookup.
As we know, each object in java has hash code method
available.So this method is supposed to return hash code of the object.
Also there is a equal and hash code contract in java. If two
objects are equal, there hash code should be same. So it is very important that there should be a robust implementation of hash code in class.
Why this hashcode is so important?
It is important because hash code
is used in storing values into the HashMap. If we lookup a value in the
corresponding given key and if the hash code is not consistent you wont be able
to lookup the corresponding value.
Map Hierarchy |
Node of the HashMap and its fields |
Lower level details:
HashMap has a table as an array of Node as show in the
diagram.
Node has integer hash, K as key of the HashMap, V as the
value of the corresponding key of the HashMap and Node<K, V> next as the
next pointer to the next node of the linked list.Basically the node itself is a
linked list.
So as in blue array diagram, each index of it is a Node of
linked list and we call it bucket.Each index is a bucket and each bucket is a
node or can be a linked list of nodes.
Implementation of the put method of the HashMap:
As I said a HashMap comprises of a table and a table is
bydefault of size 16.
HashMap Tabular Structure (defauld size is 16) |
So for example we need to put below student entries in this table, lets
see how does it put in this table:
Eg.
HashMap student = new HashMap();
student.put(“AJAY”,12);
student.put(“VIJAY”,32);
student.put(“SHARMA”,22);
Case 1:
Lets put AJAY as key and 12 as value of this key in hashmap
student.put(“AJAY”,12);
put(K k, V v){
hash(k); => hash(“AJAY”) = 23462031
index = hash &
(n-1); => index = 4
}
Here suppose hash code generated by hash(k) method of AJAY is 2346031.So we can not have
array of this size because if each and every hash is going to have this much
big number array with in it, soon we will run out of memory.
So we need to
compute index to find out where we can put the value in given 2 raise to power
n array which is 0 to 15 indexed.
That's why index is computed using modular operator. So basically we
divided the hash to the maximum value of the range of array and we will get the
reminder which will fit in the array range.
Suppose the index calculated here is 4. So the entry will
go under index 4 as a node as shown below:
Put Node values at index 4 |
student.put(“VIJAY”,32);
put(K k, V v){
hash(k); => hash(“VIJAY”) = 25462032
index = hash &
(n-1); => index = 4
}
Case 3:
student.put(“SHARMA”,22);
put(K k, V v){
hash(k); => hash(“SHARMA”) = 6416803
index = hash &
(n-1); => index = 9
}
after inserting all 3 cases, we will form below hashmap structure. At array index 4 there would be two nodes added as linked list.
After inserting all key-value pairs |
So in case of AJAY and VIJAY keys, we have collision because
we have same index. So the next will point to the new node added in the linked
list of existing node.
This is how the hashmap will look like at the end of the put
operation
So here we have seen if there is same index of the key, then
those node will be stored in the bucket as linked list nodes.
Java HashMap allows null key, which always goes to index 0
as hash of null is 0.
How get method works in HashMap ?
V get(Objcet key){
hash(key) => 23462031
index = hash & (n-1) => 9
}
checking hash code and key value of map |
In the get operation, we do the same set of operations to
calculate the hash and find index of the key where it could have store the
value in the array.
So it will compare the hash code which is 23462031 and if it
matches then we will compare the key using equal method which is SHARMA in
this case.If both matches, it will get the value.
Now we need to get key VIJAY
V get(Objcet key){
hash(key) => 25462032
index = hash & (n-1) => 4
}
get operation on hash map |
Same thing happens in case of VIJAY but at index 4, we have
two nodes in the bucket.
It will first compare hash code with first node which is not
same, so it skip this node.Then It will check next nodes hash code which matched
and then compare the key of with the same node using equal method which matched
and returns the value 32 of this node.
No comments:
Post a Comment