HashMap erlaubt einen Nullschlüssel und eine beliebige Anzahl von Nullwerten. Was nützt es?
ConcurrentHashMap
dies keine Nullschlüssel unterstützt, während dies der HashMap
Fall ist.
HashMap erlaubt einen Nullschlüssel und eine beliebige Anzahl von Nullwerten. Was nützt es?
ConcurrentHashMap
dies keine Nullschlüssel unterstützt, während dies der HashMap
Fall ist.
Antworten:
Ich bin mir nicht sicher, 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 darzustellen (dh den Wert, der verwendet werden sollte 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 Nullschlüssel speziell (da es kein .hashCode()
Nullobjekt aufrufen kann ), aber Nullwerte sind nichts Besonderes, sie werden wie alles andere in der Karte gespeichert
HashMap
( putForNullKey
) gibt es eine spezielle Methode , die damit umgeht . es speichert es in Tabelle 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
Ich denke, wir können einfach get-Methode auf Suchschlüssel aufrufen, die das gleiche Ergebnis haben wird. B val = foo.get(search);
Könnten Sie mich bitte korrigieren, wenn ich etwas falsch mache?
val
, null
wenn der Schlüssel nicht vorhanden ist. meins setzt es auf die null
Karten in der Karte. Das war der Punkt, ich speichere einen Standardwert ungleich Null am null
Schlüssel in der Karte und verwende ihn, wenn der tatsächliche Schlüssel nicht existiert
Ein Beispiel für die Verwendung von null
Werten ist die Verwendung von a HashMap
als Cache für Ergebnisse einer teuren Operation (z. B. eines Aufrufs eines externen Webdienstes), die möglicherweise zurückgegeben wird null
.
Wenn Sie einen null
Wert in die Zuordnung einfügen, können Sie zwischen dem Fall unterscheiden, in dem die Operation für einen bestimmten Schlüssel nicht ausgeführt wurde ( cache.containsKey(someKey)
Rückgabe false
), und dem Fall, in dem die Operation ausgeführt wurde, aber einen null
Wert zurückgegeben hat ( cache.containsKey(someKey)
Rückgabe true
, cache.get(someKey)
Rückgabe null
).
Ohne null
Werte müssten Sie entweder einen speziellen Wert in den Cache einfügen, um eine null
Antwort anzuzeigen , oder diese Antwort einfach überhaupt nicht zwischenspeichern und die Operation jedes Mal ausführen.
Die bisherigen Antworten berücksichtigen nur den Wert eines null
Schlüssels, aber die Frage fragt auch nach any number of null values
.
Der Vorteil des Speicherns des Werts null
für einen Schlüssel in einer HashMap ist der gleiche wie in Datenbanken usw. - Sie können einen Unterschied zwischen einem leeren Wert (z. B. Zeichenfolge "") und einem Wert (null) aufzeichnen. .
Hier ist mein nur ein wenig erfundenes Beispiel für einen Fall, in dem der null
Schlüssel nützlich sein kann:
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
der Nähe sein. Außerdem ist es nicht so, als würde der Anrufer im Allgemeinen versuchen, einen nicht vorhandenen oder bereits gestoppten Timer zu stoppen.