2010-05-31 4 views
73

HashMap autorise une clé nulle et n'importe quel nombre de valeurs nulles. Quelle est l'utilisation de celui-ci?Quelle est l'utilité d'ajouter une clé ou une valeur nulle à une HashMap en Java?

+11

« Peut-être que le problème est que rien ne nous embête, mais que nous dérangent il. » Dans – bmargulies

+3

goyave, collections Google, de nombreuses classes ne permettent pas nulle et le raisonnement derrière cela est que 95% des cas, ne pas besoin nul et ils peuvent représenter des bugs, potentiellement difficiles à trouver. – stivlo

+0

Chose étrange, 'ConcurrentHashMap' ne supporte pas les clés NULL, alors que 'HashMap' le fait. – codepleb

Répondre

106

Je ne suis pas sûr de ce que vous demandez, mais si vous cherchez un exemple quand on voudrait utiliser une clé nulle, je les utilise souvent dans les cartes pour représenter le cas par défaut (la valeur qui devrait être utilisé si une clé donnée n'est pas présent):

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

HashMap poignées clés null spécialement (car il ne peut pas appeler .hashCode() sur un objet nul), mais les valeurs nulles ne sont pas quelque chose de spécial, ils « re stocké dans la carte comme toute autre chose

+3

Donc, si .hashCode() n'est pas possible sur null qui décide quel chariot la clé null va entrer? – Pacerier

+22

@Pacerier Il existe une méthode spéciale dans 'HashMap' (' putForNullKey') qui le gère; il le stocke dans la table 0 –

+0

@MichaelMrozek votre dernière ligne 'B val = foo.containsKey (recherche)? foo.get (recherche): 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 (recherche);' pourriez-vous s'il vous plaît me corriger si je reçois quelque chose de mal? – dheerajraaj

25

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

2

Voici mon exemple seulement-un peu-artificiel d'un cas où 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; 
    } 
} 
+0

Si vous essayez d'arrêter un temporisateur inexistant, ou un qui a été arrêté déjà, cela devrait être une erreur, pas ignoré. –

+0

@QPaysTaxes - Dépend de votre intention. Si vous voulez un utilitaire léger qui peut être facilement utilisé, vous ne voulez généralement pas jeter d'Exception. De plus, ce n'est pas comme si l'on essayait d'arrêter une minuterie inexistante ou déjà arrêtée. – aroth

1

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

3

Les réponses à ce jour ne considèrent que la valeur d'avoir une clé null, mais la question pose également à propos de any number of null values. L'avantage de stocker la valeur null contre 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 vide (par exemple chaîne ""), et ne pas avoir une valeur du tout (null).

6

Un exemple d'utilisation pour nullvaleurs est l'utilisation d'un HashMap comme un cache pour les résultats d'une opération coûteuse (comme un appel à un service Web externe) qui peut revenir null.

Attribuer une valeur null sur la carte vous permet alors de distinguer entre le cas où l'opération n'a pas été effectuée pour une clé donnée (cache.containsKey(someKey) rendement false), et où l'opération a été réalisée, mais a retourné 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 et effectuer l'opération à chaque fois.

0

Une clé null peut également être utile lorsque les données carte stocke pour les sélections de l'interface utilisateur où la clé de carte représente un champ de haricots.

Une valeur de champ nul correspondant serait par exemple être représenté par « (s'il vous plaît sélectionner) » dans la sélection de l'interface utilisateur.

Questions connexes