Frage Was nützt es, einer HashMap in Java einen Null-Schlüssel oder -Wert hinzuzufügen?


HashMap ermöglicht einen Nullschlüssel und eine beliebige Anzahl von Nullwerten. Was nützt es?


75
2018-05-31 18:26


Ursprung


Antworten:


Ich bin nicht positiv, was Sie fragen, aber wenn Sie nach einem Beispiel suchen, wann man einen Nullschlüssel verwenden möchte, verwende ich sie häufig in Karten, um den Standardfall (dh den Wert, der verwendet werden sollte) darzustellen wenn ein bestimmter Schlüssel nicht vorhanden ist):

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

HashMap behandelt speziell Null-Tasten (da es nicht anrufen kann .hashCode() auf ein Null-Objekt), aber Null-Werte sind nichts besonderes, sie sind wie alles andere in der Karte gespeichert


110
2018-05-31 18:32



Ein Beispiel wäre das Modellieren von Bäumen. Wenn Sie eine HashMap verwenden, um eine Baumstruktur darzustellen, wobei der Schlüssel der übergeordnete und der Wert eine Liste von untergeordneten Elementen ist, dann werden die Werte für null Schlüssel wären die Wurzelknoten.


27
2018-03-15 20:04



Ein Anwendungsbeispiel für null  Werte ist bei Verwendung eines HashMap als Cache für Ergebnisse einer kostspieligen Operation (z. B. ein Aufruf an einen externen Webdienst), die möglicherweise zurückkehrt null.

Putting a null Mit dem Wert in der Karte können Sie dann zwischen dem Fall unterscheiden, in dem die Operation für einen bestimmten Schlüssel nicht ausgeführt wurde (cache.containsKey(someKey) kehrt zurück false) und wo die Operation ausgeführt wurde, aber a zurückgab null Wert (cache.containsKey(someKey) kehrt zurück true, cache.get(someKey) kehrt zurück null).

Ohne null Werte, müssten Sie entweder einen besonderen Wert in den Cache legen, um a anzuzeigen null Antwort oder einfach diese Antwort nicht zwischenspeichern und die Operation jedes Mal ausführen.


6
2018-06-16 09:35



Die Antworten berücksichtigen bisher nur den Wert von a null Schlüssel, aber die Frage fragt auch nach any number of null values.

Der Vorteil der Speicherung des Wertes null gegen einen Schlüssel in einer HashMap ist das gleiche wie in Datenbanken usw. - Sie können einen Unterschied zwischen einem Wert, der leer ist (z. B. String ""), und keinem Wert (null) aufzeichnen.


3
2018-06-16 08:14



Hier ist mein einziges, etwas künstliches Beispiel für einen Fall, in dem der null Schlüssel kann nützlich sein:

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
2017-10-17 02:13



Ein anderes Beispiel: Ich verwende es, um Daten nach Datum zu gruppieren. Aber einige Daten haben kein Datum. Ich kann es mit dem Header "NoDate" gruppieren


1
2018-01-08 14:23



Ein Null-Schlüssel kann auch hilfreich sein, wenn die Karte Daten für Benutzeroberflächen-Auswahlen speichert, in denen der Map-Schlüssel ein Bean-Feld darstellt.

Ein entsprechender Nullfeldwert würde beispielsweise in der UI-Auswahl als "(bitte auswählen)" dargestellt.


0
2017-11-08 10:08