I understand there is a hashing technique is applied to a key to store its value in the memory address.
But I don't understand how the collision is happening here? Which hashing algorithm does Java use to create a memory space? Is it MD5?
I understand there is a hashing technique is applied to a key to store its value in the memory address.
But I don't understand how the collision is happening here? Which hashing algorithm does Java use to create a memory space? Is it MD5?
The basic idea of HashMap
is this:
HashMap
is really an array of special objects that hold both Key and Value.hashCode()
method that every object has. Therefore, when you are writing a new Class
, you should take care of proper hashCode()
and equals()
methods implementation. The default one (of the Object
class) takes the memory pointer as a number. But that's not good for most of the classes we would like to use. For example, the String
class uses an algorithm that makes the hash from all the characters in the string - think of it like this: hashCode = 1.char + 2.char + 3.char...
(simplified). Therefore, two equal Strings, even though they are on a different location in the memory, have the same hashCode()
.hashCode()
, say "132", is then the number of bucket where the object should be stored if we had an array that big. But we don't, ours is only 16 buckets long. So we use the obvious calculation 'hashcode % array.length = bucket'
or '132 mod 16 = 4'
and store the Key-Value pair in a bucket number 4.HashMap
, so you want to tell your Maps
how many buckets you'll use if you know it in before.An image, courtesy of Wikipedia:
In this case,
mod 256
, point to four different slots in the array.Now, if you tried to look up a telephone number of Sandra Dee, you would hash her name, mod it by 256, and look into the bucket 152. There you'd find John Smith. That's no Sandra, look further ... aha, there's Sandra chained after John.
As default implementation hashCode()
function in Object
class return the memory address as the hash which is used as key in HashTable
& HashMap
.
After going through @Slanec's answer, do see the javadoc from Java-8, as there are significant changes. For ex: 'TREEIFY' where the LinkedList is converted to a TreeMap in case the threshold number of entries per bucket (currently 8) is reached.