HashMap
允许一个null
个密钥和多个null
值。
我想知道HashMap
如何处理null
键/值?我是说它是如何内部处理的?
答案 0 :(得分:3)
HashMap 定义了两个private
方法来处理 null
键:
getForNullKey()
方法调用的get(K key)
,如果密钥为 null
,~~和~~ putForNullKey(V value)
,如果密钥为 put(K key, V value)
,则从null
方法调用。 您可以在源代码中找到它们。
没有什么可以担心处理空值。它们仅被视为正常值。
答案 1 :(得分:2)
如果你检查source code它正在维护不同的方法来处理null
Offloaded version of put for null keys
408
409 private V More ...putForNullKey(V value) {
410 for (Entry<K,V> e = table[0]; e != null; e = e.next) {
411 if (e.key == null) {
412 V oldValue = e.value;
413 e.value = value;
414 e.recordAccess(this);
415 return oldValue;
416 }
417 }
418 modCount++;
419 addEntry(0, null, value, 0);
420 return null;
421 }
Offloaded version of get() to look up null keys. Null keys map to index 0. This null case is split out into separate methods for the sake of performance in the two most commonly used operations (get and put), but incorporated with conditionals in others.
334
335 private V More ...getForNullKey() {
336 for (Entry<K,V> e = table[0]; e != null; e = e.next) {
337 if (e.key == null)
338 return e.value;
339 }
340 return null;
341 }
答案 2 :(得分:0)
在HashMap中处理Null键和值
http://javaexplorer03.blogspot.in/2015/11/how-null-key-is-handled-in-hashmap.html
由于equals()和hashCode()用于存储和检索值,因此在null键的情况下它是如何工作的?
Null键是在HashMap中专门处理的, putForNullKey(V值)和getForNullKey()有两种不同的方法。稍后是卸载版本的get()来查找null键。 空键始终映射到索引0。
为了在两个最常用的操作(get和put)中执行,这个空案例被拆分成单独的方法,但在其他操作中包含条件。
简而言之,在HashMap中使用null键时不使用equals()和hashcode()方法,这里是从HashMap中检索空值的方法。
private V getForNullKey() {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null)
return e.value;
}
return null;
}
/**
* Offloaded version of put for null keys
*/
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;
}