HashMap
允许一个null
键和多个null
值。
我想知道如何HashMap
处理null
键/值?我的意思是它是如何在内部处理的?
HashMap定义了两种private
处理null
键的方法:
getForNullKey()
从get(K key)
方法中调用,如果 key 是null
, ~~and~~putForNullKey(V value)
,put(K key, V value)
如果 key 为 ,则从方法调用null
。您可以在源代码中找到它们。
处理空值也没什么好担心的。它们仅被视为正常值。
如果您检查源代码 它正在使用不同的方法来处理 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 }
在 HashMap 中处理 Null 键和值
http://javaexplorer03.blogspot.in/2015/11/how-null-key-is-handled-in-hashmap.html
由于 equals() 和 hashCode() 用于存储和检索值,在 null key 的情况下它是如何工作的?
Null 键在 HashMap 中专门处理, putForNullKey(V value) 和 getForNullKey()有两个单独的方法。后来是 get() 的卸载版本来查找空键。空键总是映射到索引 0。
为了提高两个最常用操作(get 和 put)的性能,这种 null 情况被拆分为单独的方法,但在其他操作中与条件结合。
简而言之,对于 HashMap 中的空键,不使用 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;
}