Java JDK1.6或更高版本中更改HashMap的空键机制有什么好处?

Java JDK1.6或更高版本中更改HashMap的空键机制有什么好处?,java,hashmap,Java,Hashmap,我发现JDK1.6或更高版本中的类HashMap中的空键的一些代码与以前的JDK版本(如1.5)相比发生了更改 在JDK1.5中,定义了名为NULL_KEY的静态最终对象:静态最终对象NULL_KEY=new Object() 方法,包括maskNull,unmaskNull,get和put等,将使用此对象 看 更改总是有其更改的原因,例如提高性能等。请帮我回答以下两个问题 Q#1==>为什么要进行此更改,是否存在JDK 1.5编码器中实现的HashMap的空键问题 Q#2==>JDK1.6或更

我发现JDK1.6或更高版本中的类HashMap中的空键的一些代码与以前的JDK版本(如1.5)相比发生了更改

在JDK1.5中,定义了名为NULL_KEY的静态最终对象:静态最终对象NULL_KEY=new Object()

方法,包括
maskNull
unmaskNull
get
put
等,将使用此对象

更改总是有其更改的原因,例如
提高性能
等。请帮我回答以下两个问题

Q#1==>为什么要进行此更改,是否存在JDK 1.5编码器中实现的HashMap的空键问题

Q#2==>JDK1.6或更高版本中更改HashMap的空键机制有什么好处

卸载版本的get()以查找空键。空键映射到 索引0。此空案例被拆分为单独的方法,用于 为了性能起见在两种最常用的操作(get和 put),但在其他语言中与条件句合并


这个问题似乎离题了,因为它属于programmers.stackexchange.com
static final Object NULL_KEY = new Object();
static <T> T maskNull(T key) {
    return key == null ? (T)NULL_KEY : key;
}
static <T> T unmaskNull(T key) {
    return (key == NULL_KEY ? null : key);
}

public V get(Object key) {
    Object k = maskNull(key);    
    int hash = hash(k);        
    int i = indexFor(hash, table.length); 
    Entry<K,V> e = table[i];             
    while (true) {                        
        if (e == null)
            return null;
        if (e.hash == hash && eq(k, e.key))
            return e.value;
        e = e.next;
    }
}

public V put(K key, V value) {
    K k = maskNull(key);                             
    int hash = hash(k);                             
    int i = indexFor(hash, table.length);             
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        if (e.hash == hash && eq(k, e.key)) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);              
            return oldValue;
        }
    }

    modCount++;                                       
    addEntry(hash, k, value, i);                      
    return null;
}
 public V get(Object key) {
    if (key == null)
        return getForNullKey();
    Entry<K,V> entry = getEntry(key);

    return null == entry ? null : entry.getValue();
}

 private V getForNullKey() {
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null)
            return e.value;
    }
    return null;
 }

public V put(K key, V value) {
    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;
}

/**
 * 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;
}