web-dev-qa-db-fra.com

HashMap avec clé Null et valeur Null

Considérez le code suivant:

import Java.util.*;

class Employee {

    String name;

    public Employee(String nm) {
        this.name=nm;
    }
}

public class HashMapKeyNullValue {

    Employee e1;

    public void display(){

        Employee e2=null;
        Map map=new HashMap();

        map.put(e2, "25");
        System.out.println("Getting the Value When e2 is set as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(e1, "");
        System.out.println("Getting the Value when e1 is set as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(null, null);   // null as key and null as value
        System.out.println("Getting the Value when setting null as KEY and null as value");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(null, "30");
        System.out.println("Getting the Value when setting only null as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));
    }

    public static void main(String[] args) {

        new HashMapKeyNullValue().display();

    }
}

Le résultat du programme est:

Getting the Value When e2 is set as KEY
e2 : 25
e1 : 25
null : 25
Getting the Value when e1 is set as KEY
e2 : 
e1 : 
null : 
Getting the Value when setting null as KEY and null as value
e2 : null
e1 : null
null : null
Getting the Value when setting only null as KEY
e2 : 30
e1 : 30
null : 30

Voici comment e1, e2, and null car les clés sont liées les unes aux autres. Les trois sont-ils affectés au même code de hachage? Si oui, POURQUOI?

Étant donné que les trois semblent être différents, le changement d'une valeur change l'autre. Cela signifie-t-il qu'une seule entrée de clé est créée dans HashMap ou e1, e2, or null parce que tous sont traités comme la même clé.

14
Nizam

HashMap n'appelle pas le code de hachage lorsque null est passé en tant que clé et null La clé est traitée comme un cas spécial.

Méthode Put

HashMap met null , entrez dans le compartiment 0 et mappez null comme clé de la valeur transmise. HashMap le fait par la structure de données de liste liée. HashMap utilise une structure de données de liste liée en interne.

Structure de données de liste liée utilisée par HashMap (une classe statique dans HashMap.Java)

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;
}

Dans la classe Entry, le [~ # ~] k [~ # ~] est défini sur null et la valeur mappée à la valeur passée dans la méthode put.

Méthode Get

En Hashmap get méthode vérifie si la clé est passée comme null . Valeur de recherche pour null clé dans le compartiment 0 .

Par conséquent, il ne peut y avoir qu'une seule clé nulle dans une)hashmapobject.

38
Sandeep Vaid

Si vous passez null comme clé de carte, il ira à 0 bucket. Toutes les valeurs de la clé nulle y iront. C'est pourquoi il renvoie la même valeur, car toutes les clés que vous fournissez sont null et se trouvent dans le même compartiment de votre HashMap.

6
Kamil Kłys

Dans le cas de la clé null, l'implémentation de Hashmap le considère comme un cas spécial et n'appelle pas la méthode hashCode à la place, elle stocke l'objet Entry à 0 emplacement de compartiment.

2
Ravi Soni

Lorsque vous mettez NULL à HashMap, il y a une vérification spéciale si vous essayez de mettre NULL comme clé (appelée putForNullKey ()). C'est un cas spécial et ne fonctionne pas comme si vous essayiez de mettre un objet qui n'est pas nul, et comme vous pouvez le voir, il ne va même pas au calcul du hachage.

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;
}
1
Mykola Evpak

Un HashMap ne peut stocker qu'une seule valeur par clé. Si vous souhaitez stocker plus de valeurs, vous devez utiliser un MultivalueHashMap (les collections Google Guava et Apache Commons contiennent des implémentations d'une telle carte).

e1 et e2 ont la valeur null, car vous ne leur affectez aucun objet. Donc, si vous utilisez ces variables, la clé de cette entrée de carte est également nulle, ce qui conduit à votre résultat. Null n'a pas de code de hachage, mais est toléré comme clé dans HashMap (il existe d'autres implémentations de carte qui n'autorisent pas Null comme clé).

1
dunni