72 votes

Les clés de hachage mutables sont-elles une pratique dangereuse ?

Est-ce une mauvaise pratique d'utiliser des objets mutables comme clés Hashmap ? Que se passe-t-il lorsque vous essayez de récupérer une valeur d'un Hashmap à l'aide d'une clé suffisamment modifiée pour changer son hashcode ?

Par exemple, étant donné

 class Key
{
    int a; //mutable field
    int b; //mutable field

    public int hashcode()
        return foo(a, b);
    // setters setA and setB omitted for brevity
}

avec code

 HashMap<Key, Value> map = new HashMap<Key, Value>();

Key key1 = new Key(0, 0);
map.put(key1, value1); // value1 is an instance of Value

key1.setA(5);
key1.setB(10);

Que se passe-t-il si nous appelons maintenant map.get(key1) ? Est-ce sûr ou conseillé ? Ou est-ce que le comportement dépend de la langue ?

6voto

Vishal Points 41

Si le code de hachage de la clé change après que la paire clé-valeur (Entrée) est stockée dans HashMap, la carte ne pourra pas récupérer l'Entrée.

Le code de hachage de la clé peut changer si l'objet clé est mutable. Les clés mutables dans HahsMap peuvent entraîner une perte de données.

5voto

onit Points 2820

Cela ne fonctionnera pas. Vous modifiez la valeur de la clé, vous la jetez donc essentiellement. C'est comme créer une clé et une serrure réelles, puis changer la clé et essayer de la remettre dans la serrure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X