Korrekte Methode zum Initialisieren von HashMap und kann HashMap verschiedene Werttypen enthalten?

Lesezeit: 7 Minuten

Benutzer-Avatar
Tony Stark

Daher habe ich zwei Fragen bzgl HashMaps in Java:

  1. Was ist der richtige Weg, um a zu initialisieren? HashMap? Ich denke, es könnte in meiner Situation am besten sein, Folgendes zu verwenden:

    HashMap x = new HashMap();
    

    Aber Eclipse schlägt immer wieder vor, dass ich Folgendes verwende:

    HashMap<something, something> map = new HashMap();
    

    Welches ist besser?

  2. Kann A HashMap Halten Sie verschiedene Arten von Objekten / Datentypen als Werte? Würde das zum Beispiel funktionieren und in Ordnung sein:

    map.put("one", 1);
    map.put("two", {1, 2});
    map.put("three", "hello");
    

    In der ersten put()ich möchte ein int als Wert, im zweiten an int[], und drittens eine Zeichenfolge. Ist das in Ordnung in Java mit HashMaps? Ist es auch in Ordnung, a HashMap als Wert innerhalb von a HashMap?

Benutzer-Avatar
Yishai

Es hängt wirklich davon ab, welche Art von Sicherheit Sie benötigen. Die nicht generische Methode, dies zu tun, wird am besten wie folgt durchgeführt:

 Map x = new HashMap();

Beachten Sie, dass x wird als typisiert Map. Dies macht es viel einfacher, Implementierungen zu ändern (zu a TreeMap oder ein LinkedHashMap) in der Zukunft.

Sie können Generika verwenden, um ein gewisses Maß an Typsicherheit zu gewährleisten:

Map<String, Object> x = new HashMap<String, Object>();

In Java 7 und höher können Sie dies tun

Map<String, Object> x = new HashMap<>();

Das Obige ist zwar ausführlicher, vermeidet jedoch Compiler-Warnungen. In diesem Fall ist der Inhalt der HashMap kann beliebig sein Objectdas kann also sein Integer, int[]etc. was du tust.

Wenn Sie noch Java 6 verwenden, Guave-Bibliotheken (obwohl es einfach genug ist, es selbst zu tun) hat eine Methode namens newHashMap() was die Notwendigkeit vermeidet, die generischen Typisierungsinformationen zu duplizieren, wenn Sie a new. Es leitet den Typ aus der Variablendeklaration ab (dies ist eine Java-Funktion, die für Konstruktoren vor Java 7 nicht verfügbar ist).

Übrigens, wenn Sie ein int oder ein anderes Primitiv hinzufügen, wird es von Java automatisch geboxt. Das bedeutet, dass der Code äquivalent ist zu:

 x.put("one", Integer.valueOf(1));

Sie können sicherlich eine setzen HashMap als Wert in einem anderen HashMapaber ich denke, es gibt Probleme, wenn Sie es rekursiv tun (das heißt, die HashMap als Wert an sich).

  • Was ist der Unterschied zwischen HashMap map = new… und Map map = new…? Oder machen die das gleiche?

    – Tony Stark

    28. August 2009 um 16:35 Uhr

  • Sie machen das Gleiche, nur dass Ihre Referenz als Map (die Schnittstelle) statt als HashMap (die Implementierung) typisiert wird, sodass die Implementierung einfach geändert werden kann, ohne mehr als eine Codezeile zu beeinflussen.

    – Yishai

    28. August 2009 um 16:57 Uhr

  • Sehen Sie sich die Antwort von Basil an. Map.of() ist der beste Weg für eine statische Liste mit wenigen Elementen, wobei der Initialisierer aufgerufen wird.

    – Mick Belker – Pseudonym

    19. März 2021 um 16:39 Uhr

Benutzer-Avatar
MBCook

Dies ist eine Änderung, die mit Java 1.5 vorgenommen wurde. Was Sie zuerst auflisten, ist der alte Weg, der zweite ist der neue Weg.

Durch die Verwendung von HashMap können Sie Dinge tun wie:

HashMap<String, Doohickey> ourMap = new HashMap<String, Doohickey>();

....

Doohickey result = ourMap.get("bob");

Wenn Sie die Typen nicht auf der Karte haben, müssen Sie Folgendes tun:

Doohickey result = (Doohickey) ourMap.get("bob");

Es ist wirklich sehr nützlich. Es hilft Ihnen, Fehler zu finden und zu vermeiden, dass Sie alle möglichen zusätzlichen Umwandlungen schreiben. Es war eines meiner Lieblingsfeatures von 1.5 (und neuer).

Sie können immer noch mehrere Dinge in die Map einfügen, geben Sie sie einfach als Map an, dann können Sie jedes Objekt einfügen (ein String, ein weiteres Map und Integer und drei MyObjects, wenn Sie dazu neigen).

  • Du hattest mich bis zum letzten Absatz. “Listen mit kleinem ‘l'” heißen Arrays; und sie sind definitiv Objekte in Java.

    – ChssPly76

    28. August 2009 um 16:11 Uhr

  • Sie erwähnen, dass ich, um mehrere Dinge in die Karte einzufügen, sie einfach als Karte angeben sollte. Warum konnte ich HashMap nicht verwenden?

    – Tony Stark

    28. August 2009 um 16:13 Uhr

  • @ChssPly76: “Arrays”. Das ist der Begriff. Ich konnte mich nicht daran erinnern und ging mit meiner besten Vermutung im Moment. Vielen Dank.

    – MB Cook

    28. August 2009 um 23:16 Uhr

  • @hatorade: Was ich meinte, war nur die Verwendung von Map anstelle von Map. Wenn Sie die Typen weglassen, die die Karte enthalten wird, erhalten Sie im Grunde Map. Sie können jede Art von Karte verwenden, die Sie möchten (HashMap, TreeMap, MyCustomMap usw.).

    – MB Cook

    28. August 2009 um 23:18 Uhr

Eclipse empfiehlt, dass Sie den Typ der HashMap deklarieren, da dies eine gewisse Typsicherheit erzwingt. Natürlich klingt es so, als ob Sie versuchen, Typsicherheit aus Ihrem zweiten Teil zu vermeiden.

Wenn Sie Letzteres tun möchten, versuchen Sie, map als zu deklarieren HashMap<String,Object>.

  • wird ein int als Objekt betrachtet?

    – Tony Stark

    28. August 2009 um 16:07 Uhr

  • “int”s sind keine Objekte, es ist ein primitiver Typ. Alle Primitiven (int, double, long, short…) haben eine Objektversion, die Sie verwenden können (Integer, Double, Long, Short). Java 1.5+ übernimmt sogar die Konvertierung zwischen int und Integer für Sie, sodass Sie sich darüber keine Gedanken machen müssen (meistens suchen Sie nach „autoboxing“).

    – MB Cook

    28. August 2009 um 16:10 Uhr

  • Autoboxing konvertiert int[] in ein Objekt.

    – Paul Tomblin

    28. August 2009 um 16:23 Uhr

  • int[] ist bereits ein Objekt; Du meintest sicher Single int Variable

    – ChssPly76

    28. August 2009 um 16:30 Uhr

Die Art und Weise, wie Sie es schreiben, ist äquivalent zu

HashMap<Object, Object> map = new HashMap<Object, Object>();

Was in die Klammern kommt, ist, dass Sie dem Compiler mitteilen, was Sie in die HashMap einfügen werden, damit er die Fehlerprüfung für Sie durchführen kann. Wenn Object, Object das ist, was Sie tatsächlich wollen (wahrscheinlich nicht), sollten Sie es explizit deklarieren. Im Allgemeinen sollten Sie mit der Deklaration so explizit wie möglich sein, um die Fehlerprüfung durch den Compiler zu erleichtern. Was Sie beschrieben haben, sollte wahrscheinlich so deklariert werden:

HashMap<String, Object> map = new HashMap<String, Object>();

Auf diese Weise deklarieren Sie zumindest, dass Ihre Schlüssel Zeichenfolgen sein werden, aber Ihre Werte können alles sein. Denken Sie nur daran, einen Cast zu verwenden, wenn Sie einen Wert zurückbekommen.

Der zweite verwendet Generika, die mit Java 1.5 eingeführt wurden. Es reduziert die Anzahl der Umwandlungen in Ihrem Code und kann Ihnen helfen, Fehler zur Kompilierzeit statt zur Laufzeit abzufangen. Das heißt, es hängt davon ab, was Sie codieren. Eine schnelle und schmutzige Karte, die ein paar Objekte verschiedener Typen enthält, benötigt keine Generika. Aber wenn die Map Objekte enthält, die alle von einem anderen Typ als Object abstammen, kann es sich lohnen.

Der vorherige Poster ist in Bezug auf das Array in einer Karte falsch. Ein Array ist eigentlich ein Objekt, also ein gültiger Wert.

Map<String,Object> map = new HashMap<String,Object>();
map.put("one",1); // autoboxed to an object
map.put("two", new int[]{1,2} ); // array of ints is an object
map.put("three","hello"); // string is an object

Da HashMap ein Objekt ist, kann es auch ein Wert in einer HashMap sein.

Benutzer-Avatar
Ken Liu

Eine HashMap kann jedes Objekt als Wert enthalten, auch wenn es sich um eine andere HashMap handelt. Eclipse schlägt vor, dass Sie die Typen deklarieren, da dies die empfohlene Vorgehensweise für Sammlungen ist. unter Java 5. Es steht Ihnen frei, die Vorschläge von Eclipse zu ignorieren.

Unter Java 5 wird ein int (oder irgendein primitiver Typ) sein automatisch verpackt in eine ganze Zahl (oder einen anderen entsprechenden Typ), wenn Sie es zu einer Sammlung hinzufügen. Seien Sie dabei jedoch vorsichtig, da es einige Haken bei der Verwendung von Autoboxing gibt.

Eclipse schlägt Ihnen vor, zu definieren generic type damit du haben kannst type safety. Du kannst schreiben

Map m = new HashMap();

was keine Typsicherheit gewährleistet, aber das Folgende wird Typsicherheit gewährleisten

Map<Object,Object> = new HashMap<Object,Object>();

Das Object kann jede Art sein, wie z String, Integer usw.

1382170cookie-checkKorrekte Methode zum Initialisieren von HashMap und kann HashMap verschiedene Werttypen enthalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy