HashMap autorise une clé NULL et un nombre quelconque de valeurs NULL. A quoi sert-il?
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
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.
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.
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. ).
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;
}
}
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"
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.