À 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?
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
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.
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.
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).
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;
}
}
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"
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.