HashMap ermöglicht einen Nullschlüssel und eine beliebige Anzahl von Nullwerten. Was nützt es?Was nützt es, einer HashMap in Java einen Null-Schlüssel oder -Wert hinzuzufügen?
Antwort
Ich bin nicht positiv, was Sie fragen, aber wenn Sie nach einem Beispiel suchen, wenn man einen Nullschlüssel verwenden möchte, verwende ich sie oft in Karten, um den Standardfall (dh den Wert) darzustellen das sollte verwendet werden, 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
Griffe null Schlüssel speziell (da es nicht .hashCode()
auf ein null-Objekt) aufrufen können, aber nULL-Werte sind nichts besonderes, sie in der Karte wie alles andere gespeichert
Also, wenn .hashCode() ist nicht möglich auf Null, wer entscheidet, welche Wagen den Null-Schlüssel eingeben wird? – Pacerier
@Pacerier Es gibt eine spezielle Methode in 'HashMap' (' putForNullKey'), die es handhabt; Es speichert es in Tabelle 0 –
@MichaelMrozek Ihre letzte Zeile 'B val = foo.containsKey (suchen)? foo.get (search): foo.get (null); ' Ich denke, wir können einfach Methode auf Suchschlüssel aufrufen, die das gleiche Ergebnis haben wird. 'B val = foo.get (Suche);' Könnten Sie mich bitte korrigieren, wenn ich etwas falsch mache? – dheerajraaj
Ein Beispiel wäre für die Modellierung 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, wären die Werte für den Schlüssel null
die Stammknoten.
Hier ist mein nur-etwas-konstruiertes 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;
}
}
Wenn du versuchst, einen nicht existierenden Timer zu stoppen, oder einen, der gestoppt wurde schon, das sollte ein Fehler sein, nicht ignoriert. –
@QPaysTaxes - Hängt von Ihrer Absicht ab. Wenn Sie ein leichtgewichtiges Dienstprogramm haben möchten, das einfach zu verwenden ist, möchten Sie normalerweise nicht "Exception" herumwerfen. Außerdem ist es nicht so, als ob der Aufrufer im Allgemeinen wiederherstellen kann, wenn er versucht, einen nicht vorhandenen oder bereits gestoppten Timer zu stoppen. – aroth
Ein anderes Beispiel: Ich habe es zu Gruppe Daten nach dem Datum verwenden. Aber einige Daten haben kein Datum. Ich kann es Gruppe mit dem Header „NoDate“
Die Antworten bisher nur den Wert betrachten haben einen null
Schlüssel, aber die Frage fragt auch nach any number of null values
.
Der Vorteil des Speicherns des Werts null
gegen einen Schlüssel in einer HashMap ist derselbe wie in Datenbanken usw. - Sie können einen Unterschied zwischen einem leeren Wert (z. B. string "") und keinem Wert aufzeichnen überhaupt (null).
Ein Beispiel für die Verwendung für null
Werte ist, wenn für die Ergebnisse einer teueren Operation (wie beispielsweise einen Anruf zu einem externen Web-Service) ein HashMap
als Cache verwendet, die null
zurückkehren.
einen null
Wert in der Karte Putting ermöglicht dann Sie zwischen dem Fall zu unterscheiden, wo der Betrieb für einen bestimmten Schlüssel (cache.containsKey(someKey)
kehrt false
), und wo der Betrieb aber wieder einen null
Wert wurde durchgeführt hat (cache.containsKey(someKey)
nicht durchgeführt worden gibt true
, cache.get(someKey)
zurück null
).
Ohne null
Werte müssten Sie entweder einen speziellen Wert in den Cache setzen, um eine null
Antwort anzuzeigen, oder diese Antwort einfach nicht zwischenspeichern und die Operation jedes Mal ausführen.
Ein Null-Schlüssel kann auch hilfreich sein, wenn die Karte Daten für UI-Auswahlen speichert, in denen der Map-Schlüssel ein Bean-Feld darstellt.
Ein entsprechender Nullfeldwert würde beispielsweise in der Benutzeroberflächenauswahl als "(bitte auswählen)" dargestellt.
- 1. Die Java HashMap-Implementierung hat das 'next'-Member in der Entry-Klasse. Was nützt es?
- 2. Was nützt es heutzutage für "Enden"?
- 3. Ist ExAllocatePool veraltet? Was nützt es stattdessen?
- 4. Ist es möglich, einer Sammlung in Java AutoValue einen Wert hinzuzufügen?
- 5. Java ändern Wert von hashmap
- 6. Java HashMap automatische Wert Replikationsproblem
- 7. Null Wert in Hashmap in Java
- 8. Kopieren einer HashMap in Java
- 9. Eclipse Juno - Was nützt package-info.java?
- 10. Was ist ein virtuelles Verzeichnis? Was nützt es?
- 11. Java HashMap Schlüssel Wert speichern und abrufen
- 12. Java finde mehrere tiefste Schlüssel/Wert-Paare in einer Hashmap
- 13. Kollisionsauflösung in Java HashMap
- 14. Wie deklariert man std :: unique_ptr und was nützt es?
- 15. Ist es möglich, einen Hashmap-Schlüssel umzubenennen?
- 16. Wie bestellt Java Elemente in einer HashMap oder HashTable?
- 17. Java - Gründe, null als HashMap-Schlüssel zuzulassen?
- 18. Java HashMap mit verschachtelten String oder Arraylist
- 19. Erlaube, einen neuen Wert in einer Auswahl hinzuzufügen Feldtyp
- 20. Hashcode für NULL-Schlüssel in HashMap
- 21. Einschränkung in HashMap Java
- 22. Ist es möglich, ein HashMap-Objekt in Java zurückzugeben?
- 23. Ist es wichtig, AutoCloseable in Java hinzuzufügen?
- 24. aktualisieren Wert in wandelbar HashMap
- 25. Java 8 Spliterator (oder ähnlich), der einen Wert zurückgibt, wenn es nur einen einzigen Wert gibt
- 26. Statistiken für Java HashMap
- 27. For-Schleife Hashmap Java
- 28. HashMap-Java-Programm Probleme
- 29. Angabe der Größe einer HashMap in Scala
- 30. in Geschwindigkeit können Sie durch einen Java-hashmap Eintragsmenge() durchlaufen?
"Vielleicht ist das Problem nicht, dass uns nichts stört, sondern dass wir es belästigen." – bmargulies
In Guava, google collections, lassen viele Klassen keine Null zu, und der Grund dafür ist, dass 95% der Fälle keine null benötigen und sie möglicherweise schwer zu findende Fehler darstellen. – stivlo
Seltsam ist, dass 'ConcurrentHashMap' keine Null-Schlüssel unterstützt, während' HashMap' dies tut. – codepleb