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

HashMap permet une clé nulle et n'importe quel nombre de valeurs nulles. Qu'est-ce que l'utilisation de celui-ci?

77

7 réponses

Je ne suis pas sûr de ce que vous demandez, mais si vous cherchez un exemple de quand on voudrait utiliser une clé nulle, je les utilise souvent dans les maps pour représenter le cas par défaut (c'est-à-dire la valeur qui devrait être utilisée 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 nulles spécialement (puisqu'il ne peut pas appeler .hashCode() sur un objet null), mais les valeurs nulles ne sont rien de spécial, elles sont stockées dans la carte comme n'importe quoi d'autre

113
répondu Michael Mrozek 2010-05-31 18:32:10

un exemple serait pour la modélisation des arbres. Si vous utilisez une HashMap pour représenter une structure d'arbre, où la clé est le parent et la valeur est la liste des enfants, alors les valeurs pour la clé null seraient les noeuds racine.

27
répondu tony 2015-12-03 03:09:58

un exemple d'utilisation pour null valeurs est lorsque vous utilisez un HashMap comme cache pour les résultats d'une opération coûteuse (comme un appel à un service web externe) qui peut retourner null .

mettre une valeur null dans la carte vous permet alors de distinguer le cas où l'opération n'a pas été effectuée pour une clé donnée ( cache.containsKey(someKey) retourne false ), et où l'opération a été exécuté mais retourné une valeur null ( cache.containsKey(someKey) retourne true , cache.get(someKey) retourne null ).

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

6
répondu Zorac 2015-07-23 03:24:32

les réponses jusqu'à présent ne considèrent que la valeur de avoir une null clé, mais la question pose également sur any number of null values .

l'avantage de stocker la valeur null contre une clé dans une HashMap est le même que dans les bases de données, etc - Vous pouvez enregistrer une distinction entre avoir une valeur qui est vide (par exemple string""), et ne pas avoir une valeur du tout (null).

3
répondu Eborbob 2015-06-16 08:14:26

Voici mon seul exemple quelque peu artificiel d'un cas où la touche 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
répondu aroth 2014-10-17 02:13:28

autre exemple : je l'utilise pour grouper les données par date. Mais certaines données n'ont pas de date. Je peux le grouper avec l'en-tête "NoDate"

1
répondu Anthone 2015-06-16 09:39:00

une touche null peut également être utile lorsque la carte stocke des données pour les sélections UI où la touche map représente un champ de haricots.

une valeur de champ nulle correspondante serait par exemple représentée par" (veuillez sélectionner) " dans la sélection de L'UI.

0
répondu Gunnar 2016-11-08 10:08:33