HashMap accept null while Hashtable doesn't, HashMap is not synchronized, HashMap is fast and so on along with basics like its stores key and value pairs etc.
Now from here onwards real confusion starts, Some time candidate will say that since hashcode is equal, both objects are equal and HashMap will throw exception or not store them again etc, Then you might want to remind them about equals() and hashCode() contract that two unequal object in Java can have same hashcode. Some will give up at this point and few will move ahead and say "Since hashcode is same, bucket location would be same and collision will occur in HashMap, Since HashMap use LinkedList to store object, this entry (object of Map.Entry comprise key and value ) will be stored in LinkedList. Great this answer make sense though there are many collision resolution methods available this is simplest and HashMap in Java does follow this.
"How will you retrieve Value object if two Keys will have same hashcode?”
"Do you Know how HashMap works in Java” or "How does get () method of HashMap works in Java"
"HashMap works on principle of hashing, we have put(key, value) and get(key) method for storing and retrieving Objects from HashMap. When we pass Key and Value object to put() method on Java HashMap, HashMap implementation calls hashCode method on
Key object and applies returned hashcode into its own hashing function
to find a bucket location for storing Entry object, important point to
mention is that HashMap in Java stores both key and value object as Map.Entry
in bucket which is essential to understand the retrieving logic. If
people fails to recognize this and say it only stores Value in the
bucket they will fail to explain the retrieving logic of any object
stored in Java HashMap .
"What will happen if two different objects have same hashcode?”
Now from here onwards real confusion starts, Some time candidate will say that since hashcode is equal, both objects are equal and HashMap will throw exception or not store them again etc, Then you might want to remind them about equals() and hashCode() contract that two unequal object in Java can have same hashcode. Some will give up at this point and few will move ahead and say "Since hashcode is same, bucket location would be same and collision will occur in HashMap, Since HashMap use LinkedList to store object, this entry (object of Map.Entry comprise key and value ) will be stored in LinkedList. Great this answer make sense though there are many collision resolution methods available this is simplest and HashMap in Java does follow this.
"How will you retrieve Value object if two Keys will have same hashcode?”
Interviewee will say we will call get() method
and then HashMap uses Key Object's hashcode to find out bucket location
and retrieves Value object but then you need to remind him that there
are two Value objects are stored in same bucket , so they will say about
traversal in LinkedList until we find the value object , then you ask how do you identify value object because you don't have value object to compare ,Until they know that HashMap stores both Key and Value in LinkedList node or as Map.Entry they won't be able to resolve this issue and will try and fail.
But those bunch of people who remember this key information will say that after finding bucket location , we will call keys.equals() method to identify correct node in LinkedList and return associated value object for that key in Java HashMap . Perfect this is the correct answer.
Why String, Integer and other wrapper classes are considered good keys ?
String, Integer and other wrapper classes are natural candidates of HashMap key, and String is most frequently used key as well because String is immutable and final,and overrides equals and hashcode() method.
Other wrapper class also shares similar property. Immutabiility is
required, in order to prevent changes on fields used to calculate hashCode() because if key object return different hashCode during insertion and retrieval than it won't be possible to get object from HashMap. Immutability is best as it offers other advantages as well like thread-safety, If you can keep your hashCode same by only making certain fields final, then you go for that as well. Since equals() and hashCode() method is used during reterival of value object from HashMap,
its important that key object correctly override these methods and
follow contact. If unequal object return different hashcode than chances
of collision will be less which subsequently improve performance of
HashMap.
Can we use any custom object as key in HashMap ?
This is an extension of previous questions. Ofcourse you can use any Object as key in Java HashMap provided it follows equals and hashCode contract and its hashCode should not vary once the object is inserted into Map. If custom object is Immutable than this will be already taken care because you can not change it once created.
How HashMap works in Java
HashMap works on principle of hashing, we have put() and get()
method for storing and retrieving object form HashMap .When we pass an
both key and value to put() method to store on HashMap , it uses key
object hashcode() method to calculate hashcode and they by applying
hashing on that hashcode it identifies bucket location for storing value
object. While retrieving it uses key object equals method to find out
correct key value pair and return value object associated with that key.
HashMap uses linked list in case of collision and object will be
stored in next node of linked list.
Also HashMap stores both key+value tuple in every node of linked list.
What will happen if two different HashMap key objects have same hashcode?
They will be stored in
same bucket but no next node of linked list. And keys equals () method
will be used to identify correct key value pair in HashMap .
No comments:
Post a Comment