web-dev-qa-db-fra.com

À quoi sert-il d'ajouter une clé ou une valeur nulle à un HashMap en Java?

HashMap autorise une clé NULL et un nombre quelconque de valeurs NULL. A quoi sert-il?

83
subhashis

Je ne suis pas sûr de ce que vous demandez, mais si vous cherchez un exemple d'utilisation d'une clé nulle, je les utilise souvent dans des mappes pour représenter le cas par défaut (c'est-à-dire la valeur à utiliser). si une clé donnée n'est pas présente):

Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);

HashMap gère les clés null spécialement (car il ne peut pas appeler .hashCode() sur un objet null), mais les valeurs null ne sont rien de spécial, elles sont stockées dans la carte comme n'importe quoi d'autre

118
Michael Mrozek

Un exemple serait pour les arbres de modélisation. Si vous utilisez un HashMap pour représenter une arborescence, où la clé est le parent et la valeur est la liste des enfants, les valeurs de la clé null seraient les nœuds racine.

28
tony

Un exemple d'utilisation de null values ​​est l'utilisation de HashMap en tant que cache pour les résultats d'une opération coûteuse (telle qu'un appel à un service Web externe) pouvant renvoyer null.

Le fait de mettre une valeur null dans la mappe vous permet ensuite de distinguer le cas où l'opération n'a pas été effectuée pour une clé donnée (cache.containsKey(someKey) renvoie false) et celui où l'opération a été effectuée mais qui a renvoyé une valeur null (cache.containsKey(someKey) renvoie true, cache.get(someKey) renvoie null).

Sans les valeurs null, vous devez soit mettre une valeur spéciale dans le cache pour indiquer une réponse null, soit simplement ne pas mettre en cache cette réponse du tout et effectuer l'opération à chaque fois.

6
Zorac

Jusqu'à présent, les réponses considèrent uniquement la valeur d'une clé null, mais la question concerne également any number of null values.

L’avantage de stocker la valeur null contre une clé dans un tableau de hachage est identique à celui des bases de données, etc. ).

3
Eborbob

Voici mon exemple un peu artificiel dans lequel la clé null peut être utile:

public class Timer {
    private static final Logger LOG = Logger.getLogger(Timer.class);
    private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();

    public static synchronized void start() {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(null)) {
            LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms"); 
        }
        START_TIMES.put(null, now);
    }

    public static synchronized long stop() {
        if (! START_TIMES.containsKey(null)) {
            return 0;
        }

        return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
    }

    public static synchronized void start(String name) {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(name)) {
            LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms"); 
        }
        START_TIMES.put(name, now);
    }

    public static synchronized long stop(String name) {
        if (! START_TIMES.containsKey(name)) {
            return 0;
        }

        return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
    }

    private static long printTimer(String name, long start, long end) {
        LOG.info(name + " timer ran for " + (end - start) + "ms");
        return end - start;
    }
}
2
aroth

Autre exemple: je l’utilise pour regrouper les données par date . Certaines données n’ont pas de date. Je peux le regrouper avec l'en-tête "NoDate"

1
Anthone

Une clé nulle peut également être utile lorsque la carte stocke des données pour les sélections d'interface utilisateur lorsque la clé de carte représente un champ de bean.

Une valeur de champ NULL correspondante serait par exemple représentée par "(veuillez sélectionner)" dans la sélection d'interface utilisateur.

0
Gunnar