Was ist der Unterschied zwischen HashMap und Map-Objekten in Java?
Was ist der Unterschied zwischen folgenden Karten, die ich erstellen (in einer anderen Frage, die Leute beantworten, mit Ihnen scheinbar austauschbar und ich Frage mich, ob/wie Sie unterschiedlich sind):
HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();
InformationsquelleAutor Tony Stark | 2009-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen Unterschied zwischen den Objekten; Sie haben eine
HashMap<String, Object>
in beiden Fällen. Es gibt einen Unterschied in der Schnittstelle Sie auf das Objekt. Im ersten Fall ist die SchnittstelleHashMap<String, Object>
, während in der zweiten es istMap<String, Object>
. Aber das zugrunde liegende Objekt ist das gleiche.Den Vorteil der Verwendung
Map<String, Object>
ist, dass Sie ändern können, das zugrunde liegende Objekt um eine andere Art von Karte, ohne zu brechen Ihren Vertrag mit irgendwelchen code, der es nutzt. Wenn Sie deklarieren es alsHashMap<String, Object>
Sie müssen Ihren Vertrag ändern, wenn Sie möchten, ändern Sie die zugrunde liegende Implementierung.Beispiel: sagen wir, ich Schreibe diese Klasse:
Die Klasse hat ein paar interne Karten von string->Objekt, das es teilt (über accessor-Methoden) mit Unterklassen. Sagen wir, ich Schreibe es mit
HashMap
s, mit zu beginnen, weil ich denke, dass das die geeignete Struktur zu verwenden, wenn das schreiben der Klasse.Später, Mary schreibt code Unterklassen. Sie hat etwas, was Sie braucht, um mit beiden
things
undmoreThings
, so natürlich Sie sagt, dass in einer gemeinsamen Methode, und Sie verwendet die gleiche Art, die ich verwendetgetThings
/getMoreThings
bei der Definition Ihrer Methode:Später, beschließe ich, tatsächlich, es ist besser, wenn ich
TreeMap
stattHashMap
imFoo
. Ich updateFoo
, ändernHashMap
zuTreeMap
. JetztSpecialFoo
nicht mehr übersetzen, denn ich habe den Vertrag gebrochen:Foo
verwendet, um zu sagen, dass es, sofernHashMap
s, aber jetzt ist es die BereitstellungTreeMaps
statt. Also müssen wir fixSpecialFoo
jetzt (und diese Art der Sache kann die welligkeit durch eine Codebasis).Es sei denn, ich hatte einen wirklich guten Grund für die Freigabe, dass meine Umsetzung war mit einem
HashMap
(und das passiert), was ich getan haben sollte war erklärengetThings
undgetMoreThings
als Rückgabe nurMap<String, Object>
ohne sein mehr spezifisch, als dass. In der Tat, abgesehen von ein guter Grund, etwas anderes zu tun, sogar innerhalbFoo
ich sollte wohl erklärenthings
undmoreThings
alsMap
, nichtHashMap
/TreeMap
:Hinweis, wie ich jetzt mit
Map<String, Object>
überall, wo ich kann, nur, wenn ich bestimmte erstellen, die die eigentlichen Objekte.Wenn ich das gemacht hätte, dann Mary hat dies getan:
...und ändern
Foo
würde nicht gemacht habenSpecialFoo
halt kompilieren.Schnittstellen (und Basisklassen) lasst uns zeigen nur so viel wie nötig, um unsere Flexibilität unter der Decke, sind änderungen angebracht. Im Allgemeinen, wir wollen unsere Referenzen werden so einfach wie möglich. Wenn wir nicht brauchen, zu wissen, dass es eine
HashMap
, nur nennen Sie es eineMap
.Dies ist nicht ein blind-Regel, aber im Allgemeinen Codierung, um die meisten Allgemeinen Schnittstelle wird weniger spröde als Kodierung, um etwas genauer zu sein. Wenn ich erinnerte mich, dass ich nicht hätte erstellt eine
Foo
eingestellt, dass Mary sich für das scheitern mitSpecialFoo
. Wenn Maria hatte sich daran erinnerte, dass, dann, auch wenn ich DurcheinanderFoo
Sie würden deklariert haben Ihr eigenes Methode mitMap
stattHashMap
und meine wechselndenFoo
's Vertrag wäre nicht ausgewirkt haben, Ihr code.Manchmal kann man nicht tun, manchmal müssen Sie spezifisch sein. Aber es sei denn, Sie haben einen Grund zu sein, irren in Richtung der Beine-spezifische Schnittstelle.
Ja, Sie sind genau dasselbe Objekt, es ist über die Vertrag Sie bilden mit jedem code verwenden. Ich aktualisierte die Antwort ein bisschen zu klären.
ah, also der Unterschied ist, dass in der Regel, Karte hat bestimmte Methoden zugeordnet. aber es gibt verschiedene Möglichkeiten, oder eine Karte erstellen, wie eine HashMap, und diese verschiedenen Möglichkeiten bieten einzigartige Methoden, die nicht alle Karten haben. Also, wenn ich eine Karte habe, kann ich nur mit Map-Methoden, aber ich habe eine HashMap unter so jede Geschwindigkeit nutzen, suchen, Vorteile, etc der HashMap wird gesehen in der Karte. Und wenn ich eine HashMap, die ich verwenden könnte, diese HashMap spezifische Methoden und wenn ich letztendlich müssen Sie zum ändern der map-Typ, es ist viel mehr Arbeit.
Ich denke was er sagt ist, dass selbst wenn Sie unter Bezugnahme auf eine HashMap als eine Karte, die Umsetzung bleibt eine HashMap und so ändert sich nichts darüber, wie die Methoden auszuführen. Wenn Sie änderungen an der Implementierung, die hinter der Map-Schnittstelle, Eigenschaften, Ausführung (wie Geschwindigkeit) könnte sich ja ändern.
Dies ist eine große Antwort. Noch besser wäre es, mit Beispielen.
InformationsquelleAutor T.J. Crowder
Anzeigen ist eine Schnittstelle, die HashMap implementiert. Der Unterschied ist, dass in der zweiten Umsetzung Ihrer Bezugnahme auf die HashMap erlaubt nur die Verwendung von definierten Funktionen in der Map-Schnittstelle, während die erste erlaubt die Verwendung von öffentlichen Funktionen in HashMap (was beinhaltet das Map-interface).
Wird es wahrscheinlich mehr Sinn machen, wenn Sie Lesen Sonne-interface tutorial
Es ist ähnlich, wie oft eine Liste implementiert ist als eine ArrayList
InformationsquelleAutor Graphics Noob
Karte verfügt über die folgenden Implementierungen:
HashMap
Map m = new HashMap();
LinkedHashMap
Map m = new LinkedHashMap();
Baum Anzeigen
Map m = new TreeMap();
WeakHashMap
Map m = new WeakHashMap();
Angenommen, Sie haben erstellt eine Methode (das ist nur pseudocode).
Angenommen, Ihr Projekt ändern sich die Anforderungen:
HashMap
.HashMap
zuLinkedHashMap
.LinkedHashMap
zuTreeMap
.Wenn Ihr Methode gibt bestimmte Klassen anstelle von etwas, das realisiert die
Map
- Schnittstelle, müssen Sie ändern Sie den Rückgabetyp dergetMap()
Methode jedes mal.Aber wenn Sie den Polymorphismus feature von Java, und anstatt spezifische Klassen, die die Schnittstelle
Map
es verbessert die code-Wiederverwendbarkeit und reduziert die Auswirkungen von änderungen der Anforderung.InformationsquelleAutor atish shimpi
Ich war gerade dabei, dies zu tun, als einen Kommentar auf die akzeptierte Antwort, aber es kam zu funky (ich hasse es, nicht mit Zeilenumbrüchen)
Genau--, und Sie wollen immer, um die meisten Allgemeinen Schnittstelle, die Sie können. Betrachten ArrayList vs LinkedList. Großen Unterschied in wie Sie Sie verwenden, aber wenn Sie verwenden Sie "Liste" können Sie zwischen Ihnen wechseln leicht.
In der Tat, können Sie ersetzen Sie die Rechte Seite der Initialisierung mit einem mehr dynamischen Anweisung. wie wäre es mit etwas wie dieses:
Diese Weise, wenn Sie gehen zu füllen Sie die Sammlung mit einer insertion sort verwenden, würden Sie eine verlinkte Liste (insertion sort in eine array-Liste ist kriminell.) Aber wenn Sie nicht brauchen, um es zu halten sortiert und sind nur anfügen, verwenden Sie eine ArrayList (effizienter für andere Operationen).
Dies ist eine ziemlich große Sache hier, weil die Sammlungen nicht das beste Beispiel, aber in OO-design eines der wichtigsten Konzepte ist, die über die Schnittstelle Fassade, um den Zugriff auf die verschiedenen Objekte mit dem genau gleichen code.
Bearbeiten, reagieren, Stellung zu nehmen:
Als Ihre map ein Kommentar, ja mit dem "Map" - Schnittstelle schränkt Sie nur die Methoden, es sei denn, Sie Stimmen der Sammlung wieder vom Map HashMap (die VÖLLIG Niederlagen der Zweck).
Oft, was Sie tun werden ist, erstellen Sie ein Objekt und füllen es in mit es bestimmten Typs (HashMap), die in einer Art von "erstellen" oder "initialize" - Methode, aber diese Methode wird wieder eine "Karte", die nicht bearbeitet werden müssen, wie eine HashMap nicht mehr.
Wenn Sie jemals zu werfen, die durch die Art und Weise, verwenden Sie wahrscheinlich die falsche Schnittstelle oder dein code ist nicht strukturiert und gut genug. Beachten Sie, dass es akzeptabel ist, zu einem Abschnitt des Codes behandeln es als eine "HashMap", während die anderen behandelt es als eine "Karte", aber das soll fließen "nach unten". so dass man nie Gießen.
Beachten Sie auch die semi-ordentlich Aspekt von Rollen gekennzeichnet durch Schnittstellen. Eine LinkedList macht einen guten stack oder queue, ArrayList macht einen guten stack, aber eine schreckliche Schlange (wieder ein entfernen würde zu einer Verschiebung der gesamten Liste), so LinkedList implementiert die Queue-interface, ArrayList nicht.
ich denke, was ich Suche, ist, ob oder nicht, wenn ich sage, Map<string, string> m = new HashMap<string, Zeichenfolge>() meine Karte m können die Methoden verwenden, die spezifisch für HashMap, oder nicht. Ich denke er kann nicht?
ah, warte, Nein, meine Karte m von oben, muss die Methoden von HashMap.
also im Grunde der einzige Vorteil der Verwendung der Karte in die Benutzeroberfläche sense' ist, dass wenn ich eine Methode, die erfordert eine Karte, ich bin garantiert jede Art von Karte wird die Arbeit in dieser Methode. aber wenn ich eine hashmap, ich sage: die Methode funktioniert nur mit hashmaps. oder, anders ausgedrückt, meine Methode verwendet nur Methoden definiert, die in der Map-Klasse geerbt, aber durch die anderen Klassen, die sich über Anzeigen.
neben dem Vorteil, die Sie bereits erwähnt, wo mit der Liste bedeutet, dass ich nicht brauchen, um zu entscheiden, welche Art der Liste, ich will erst zur Laufzeit, in der Erwägung, dass, wenn die Schnittstelle, was nicht vorhanden ist, würde ich für eine zu entscheiden, vor dem kompilieren und ausführen
InformationsquelleAutor Bill K
Wie bereits von TJ Crowder und Adamski, ein Verweis auf eine Schnittstelle, die andere zu einer spezifischen Implementierung der Schnittstelle. Laut Joshua Block, sollten Sie immer versuchen, um code-Schnittstellen, damit Sie besser in den Griff änderungen der zugrunde liegenden Implementierung - d.h. wenn HashMap plötzlich war nicht ideal für Ihre Lösung, und Sie Bedarf, um den map-Implementierung, Sie konnte immer noch die Karte-Schnittstelle, und ändern Sie die Instanziierung geben.
InformationsquelleAutor aperkins
In Ihrem zweiten Beispiel ist die "map" die Referenz ist vom Typ
Map
, die eine Schnittstelle implementiert, indemHashMap
(und andere Arten vonMap
). Diese Schnittstelle ist eine Vertrag sagen, dass die Objekt-Karten-Tasten, um Werte und unterstützt verschiedene Operationen (z.B.put
,get
). Es sagt nichts über die Umsetzung derMap
(in diesem Fall eineHashMap
).Der zweite Ansatz ist in der Regel bevorzugt, da Sie in der Regel würde nicht wollen, um Zugang zu den spezifischen map-Implementierung für Methoden, die mit der
Map
oder über eine API-definition.InformationsquelleAutor Adamski
Map ist der statischen Typ der Karte, während HashMap ist die dynamische Typ der Karte. Dies bedeutet, dass der compiler behandeln Sie Ihre map-Objekt als eine Art Karte, obwohl zur Laufzeit, kann es keinen Subtyp.
Diese Praxis der Programmierung gegen Schnittstellen statt-Implementierungen hat den zusätzlichen Vorteil, flexibel bleiben: Sie können zum Beispiel ersetzen Sie den dynamischen Typ von map zur Laufzeit, solange es ist ein Subtyp von Map (z.B. LinkedHashMap), und ändern Sie die map-Verhalten on-the-fly.
Eine gute Faustregel ist, um zu bleiben so Abstrakt wie möglich auf der API-Ebene: Wenn zum Beispiel eine Methode, die Sie Programmieren müssen die Karten, dann es ist ausreichend, um einen parameter zu deklarieren, die als Karte anstelle der strengeren (da weniger Abstrakt) HashMap geben. Dass die Art und Weise, die Verbraucher Ihre API flexibel sein können, über welche Art von Map-Implementierung, die Sie übergeben möchten, auf Ihre Methode.
InformationsquelleAutor Matthias
Erstellen Sie die gleichen Karten.
Aber Sie können füllen Sie den Unterschied, wenn Sie es verwenden. Mit dem ersten Fall, dass Sie werde in der Lage sein, die Verwendung von speziellen HashMap Methoden (aber ich erinnere mich nicht jemand wirklich nützlich), und Sie werden in der Lage sein, es weiterzugeben, als eine HashMap parameter:
InformationsquelleAutor Roman
Map-Schnittstelle und Hashmap ist eine Klasse, die Map-Schnittstelle
InformationsquelleAutor
Hinzufügen, um die top-stimmten Antwort und viele oben betont, die "allgemeineren, besser", würde ich mag, um zu Graben ein wenig mehr.
Map
ist die Struktur während der VertragslaufzeitHashMap
ist eine Implementierung bietet seine eigenen Methoden im Umgang mit verschiedenen realen Probleme: so berechnen Sie den index, was ist die Kapazität und wie erhöhen Sie, wie Sie einfügen, so halten Sie den index unique, etc.Schauen wir in den Quellcode:
In
Map
haben wir die Methode dercontainsKey(Object key)
:JavaDoc:
Bedarf es Ihrer Implementierungen zu implementieren, aber das "wie" ist in seiner Freiheit, nur um sicherzustellen, dass es gibt richtige.
In
HashMap
:Es stellt sich heraus, dass
HashMap
verwendet hashcode zu testen, ob diese Karte enthält den Schlüssel. Also es hat den Vorteil der hash-Algorithmus.InformationsquelleAutor WesternGun
Karte ist die Schnittstelle und ist die Klasse Hashmap implementiert.
So, in dieser Implementierung erstellen Sie die gleichen Objekte
InformationsquelleAutor Diego Dias
HashMap ist eine Implementierung der Map, so ist es ganz das gleiche, aber hat, "clone ()" - Methode wie ich das sehe, im Referenz-Handbuch))
InformationsquelleAutor kolyaseg
Zunächst
Map
ist eine Schnittstelle es hat verschiedene Implementierung wie -HashMap
,TreeHashMap
,LinkedHashMap
etc. - Schnittstelle funktioniert wie ein super-Klasse für die Umsetzung Klasse. So nach OOP-Regel, die eine konkrete Klasse, dieMap
ist einMap
auch. Das heißt, wir ordnen/setzen keineHashMap
variable vom Typ einerMap
variable vom Typ ohne jede Art von casting.In diesem Fall können wir zuordnen
map1
zumap2
ohne casting oder jeglichen Verlust von Daten -InformationsquelleAutor Razib