HashMap autorise une clé nulle et un nombre quelconque de valeurs nulles. Quelle en est l'utilité?
ConcurrentHashMap
cela ne prend pas en charge les clés nulles, alors que le HashMap
fait.
HashMap autorise une clé nulle et un nombre quelconque de valeurs nulles. Quelle en est l'utilité?
ConcurrentHashMap
cela ne prend pas en charge les clés nulles, alors que le HashMap
fait.
Réponses:
Je ne suis pas sûr de ce que vous demandez, mais si vous cherchez un exemple de cas où l'on voudrait utiliser une clé nulle, je les utilise souvent dans les cartes 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 spécialement les clés nulles (car il ne peut pas appeler .hashCode()
un objet nul), mais les valeurs nulles ne sont rien de spécial, elles sont stockées dans la carte comme toute autre chose
HashMap
( putForNullKey
) qui le gère; il le stocke dans la table 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
Je pense que nous pouvons simplement appeler la méthode get sur la clé de recherche qui aura le même résultat. B val = foo.get(search);
pourriez-vous s'il vous plaît me corriger si je me trompe?
val
sur null
si la clé n'existe pas; le mien le définit sur n'importe quelle null
carte sur la carte. C'était le point, je stocke une valeur non nulle par défaut à la null
clé de la carte et l'utilise si la clé réelle n'existe pas
Un exemple d'utilisation des null
valeurs est l'utilisation de a 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 null
valeur dans la carte 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é effectuée mais a renvoyé une null
valeur ( cache.containsKey(someKey)
retourne true
, cache.get(someKey)
retourne null
).
Sans null
valeurs, vous devrez soit mettre une valeur spéciale dans le cache pour indiquer une null
réponse, soit simplement ne pas mettre en cache cette réponse du tout et effectuer l'opération à chaque fois.
Les réponses jusqu'à présent ne considèrent que la valeur d'une null
clé, mais la question pose également des questions any number of null values
.
L'avantage de stocker la valeur par null
rapport à une clé dans un 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, une chaîne "") et ne pas avoir de valeur du tout (null) .
Voici mon seul exemple quelque peu artificiel d'un cas où la null
clé 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;
}
}
throw Exception
. En outre, ce n'est pas comme si tenter d'arrêter une minuterie inexistante ou déjà arrêtée est quelque chose dont l'appelant peut généralement récupérer.
Une clé nulle peut également être utile lorsque la carte stocke des données pour les sélections d'interface utilisateur où la clé de carte représente un champ de bean.
Une valeur de champ nulle correspondante serait par exemple représentée par "(veuillez sélectionner)" dans la sélection de l'interface utilisateur.