HashMap
does not call hashcode when null is passed as key and null Key is handled as special case.Put Method
HashMap
puts null key in bucket 0 and maps null as key to passed value. it does it by linked list data structure it uses internally.Linked list data structure used by
HashMap
(a static class in HashMap.java
)static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
}
In Entry class the K is set to null and value mapped to value passed in put method.Get Method
While inHashmap
get method the checks if key is passed as null. Search Value for null key in bucket 0.Hence there can only be one null key in one
hashmap
object.
When you put NULL to HashMap there is special check if you are trying to put NULL as key (called putForNullKey()).
It is special case and works not like you are trying to put some object
which is not null, and as you may see it even doesn't go to hash
calculation.
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
No comments:
Post a Comment