Dart hat einen Map-Typ mit Implementierungen wie HashMap, LinkedHashMap und SplayTreeMap. Was ist der Unterschied zwischen diesen verschiedenen Map-Implementierungen?Was sind die Unterschiede zwischen den verschiedenen Map-Implementierungen in Dart?
Antwort
Dart hat integrierte Unterstützung für Sammlungen wie Liste, Satz und Karte. Dart verfügt über verschiedene Map-Implementierungen. Wenn Sie die Vor- und Nachteile von Implementierungen verstehen, können Sie eine fundierte Entscheidung treffen.
. (Anmerkung: das um die Zeit der Dart M3 geschrieben ist, so folgt, was man nicht die Dokumentation in diesem Moment entspricht)
Was ist eine Karte?
Eine Map ist ein assoziativer Container, der den Schlüsseln Werte zuordnet. Schlüssel sind eindeutig und können auf einen einzigen Wert verweisen. Ein Schlüssel darf nicht null sein, aber ein Wert kann null sein.
Karte Literale
Dart unterstützt Karte Literale, wie folgt aus:
var accounts = {'323525': 'John Smith', '588982': 'Alice Jones'};
Die Spezifikation sagt, dass Karte Literale Auftrag pflegen müssen. Dies bedeutet, dass accounts
eine Instanz von ist.
Die Spezifikation besagt auch, dass Map-Literalschlüssel Strings sein müssen. Dies könnte sich in Zukunft ändern.
neue Karte()
Dart unterstützt Werksbauer, so dass Sie eine neue Instanz der Karte wie folgt erstellen:
var accounts = new Map();
Die Map
Klasse ist abstrakt, die die Fabrik Konstruktor bedeutet eine tatsächlich schafft Instanz einer Unterklasse von Map
. Was ist der tatsächliche Typ von accounts
?
Frühere Versionen von Dart erstellten eine neue Instanz von HashMap
aus dem new Map()
Konstruktor. Dart bug 5803 besagt jedoch, dass {}
und new Map
denselben Typ zurückgeben, new Map
bald eine Instanz.zurückgeben wird.
LinkedHashMap (oder InsertionOrderedMap)
A LinkedHashMap
iteriert durch Schlüssel und Werte in der gleichen Reihenfolge, wie sie eingesetzt wurden.
Hinweis: LinkedHashMap wird wahrscheinlich in InsertionOrderedMap umbenannt. Folgen Sie für den Fortschritt. Hier
ein Beispiel:
import 'dart:collection';
main() {
var ordered = new LinkedHashMap();
ordered['32352'] = 'Alice';
ordered['95594'] = 'Bob';
for (var key in ordered.keys) {
print(key);
}
// guaranteed to print 32352, then 95594
}
Hier ist die source code for LinkedHashMap. (Wenn dieser Link nicht mehr funktioniert, ist es wahrscheinlich, weil die Klasse umbenannt wurde)
HashMap
A HashMap hat keine Garantie für Auftrag erhalten.Wenn Sie die Schlüssel oder Werte einer HashMap durchlaufen, können Sie keine bestimmte Reihenfolge erwarten.
Eine HashMap wird mit einem hash table implementiert. Hier
ist ein Beispiel für eine neue HashMap zu schaffen:
import 'dart:collection';
main() {
var accounts = new HashMap();
}
Wenn Sie nicht über die Aufrechterhaltung Auftrag ist es egal, verwenden HashMap.
Hier ist die source code of HashMap.
SplayTreeMap
Ein Spreizfuß Baum ist ein Balancierter Baum mit der zusätzlichen Eigenschaft, die vor kurzem zugegriffen Elemente wieder schnell zugänglich sind. Es führt grundlegende Operationen wie Einfügen, Nachschlagen und Entfernen in O (log (n)) amortisierten Zeit durch.
import 'dart:collection';
main() {
var accounts = new SplayTreeMap();
}
Eine SplayTreeMap erfordert, dass alle Schlüssel vom selben Typ sind.
Ein Splay-Tree ist eine gute Wahl für Daten, die häufig gespeichert und abgerufen werden, wie Caches. Der Grund ist, dass sie Baumrotationen verwenden, um ein Element für bessere Zugriffe auf die Wurzel zu bringen. Die Leistung kommt von der Selbstoptimierung des Baumes. Das heißt, Elemente, auf die häufig zugegriffen wird, werden näher an den Anfang verschoben. Wenn jedoch der Baum überall gleich häufig aufgerufen wird, ist es wenig sinnvoll, eine Splay-Tree-Map zu verwenden.
Ein Beispielfall ist ein Modemrouter, der Netzwerkpakete mit sehr hohen Raten empfängt. Das Modem muss entscheiden, welches Paket in welcher Leitung geht. Es kann eine Map-Implementierung verwenden, bei der der Schlüssel die IP und der Wert das Ziel ist. Eine Splay-Tree-Map ist eine gute Wahl für dieses Szenario, da die meisten IP-Adressen mehr als einmal verwendet werden und diese daher im Stammverzeichnis der Baumstruktur gefunden werden können.
- 1. Was sind die Unterschiede zwischen Clang unter verschiedenen Pfaden?
- 2. Was sind die Unterschiede zwischen den Umgebungsvariablen in ASP.NET Core?
- 3. Was sind die Unterschiede zwischen Karma Reportern?
- 4. Was sind die Unterschiede zwischen zweien?
- 5. Was sind die Unterschiede zwischen den folgenden zwei JavaScript-Code?
- 6. Was sind die Unterschiede zwischen den folgenden Codes
- 7. Unterschiede zwischen den verschiedenen Geschmacksrichtungen von shared_ptr
- 8. Was sind die praktischen Unterschiede zwischen Fliegengewicht und Singleton-Mustern?
- 9. Was sind die Unterschiede zwischen g ++ Version 4.0.0.8 und 4.3.2?
- 10. Unterschiede zwischen verschiedenen Bool-Typen?
- 11. Was sind die Unterschiede zwischen Azure Virtual Machines & Cloud Services?
- 12. Was sind die Unterschiede zwischen Funktionen und Subroutinen in Fortran?
- 13. Was sind die Unterschiede in JIT zwischen Java und. NET
- 14. Was sind die Unterschiede zwischen cElementtree und ElementTree?
- 15. Was sind die Unterschiede zwischen & und &&, | und || in R?
- 16. Was sind die Unterschiede zwischen HasOne und Referenzen in Nhibernate?
- 17. Was sind die Unterschiede zwischen ADOdb und PDO in PHP?
- 18. Was sind die Unterschiede zwischen ConcurrentQueue und BlockingCollection in .Net?
- 19. Was sind Unterschiede zwischen SQL-Abfragen?
- 20. Was sind die Unterschiede zwischen Model, ModelMap und ModelAndView?
- 21. Was sind die praktischen Unterschiede zwischen imagick :: INTERLACE_JPEG/INTERLACE_PLANE/INTERLACE_LINE?
- 22. Was sind die Unterschiede zwischen Opera Unite und Node.js?
- 23. Was sind die Unterschiede zwischen Fork(), Subprocess(), CreateProcess()?
- 24. Was sind die aktuellen Unterschiede zwischen jQuery und Prototype?
- 25. Was sind die Unterschiede zwischen diesen Arten von Zeigern?
- 26. Was sind die Unterschiede zwischen maxJsonLength und MaxJsonDeserializerMembers?
- 27. Was sind die Unterschiede zwischen dem leeren Objekttyp und Objekt?
- 28. Was sind die Unterschiede zwischen "./Build.sbt" und "./Project/build.sbt"?
- 29. Was sind die Unterschiede zwischen Entweder und Option?
- 30. Was sind die Unterschiede zwischen Perl und Java Regex-Funktionen?
Um mehr zu den Splay-Bäumen hinzuzufügen: sie verwenden [Baumrotationen] (http://en.wikipedia.org/wiki/Tree_rotation), um ein Element nach oben für bessere häufige Zugriffe zu bringen. Die Leistung kommt von der Selbstoptimierung des Baumes. Das heißt, Elemente, auf die häufig zugegriffen wird, werden für einen besseren häufigen Zugriff näher an die Spitze bewegt. Deshalb ist es eine gute Wahl für so etwas wie einen Cache. Wenn jedoch der Baum überall gleich häufig aufgerufen wird, ist es wenig sinnvoll, eine Splay-Tree-Map zu verwenden. –
Kai, Danke für die extra Klärung. Fühlen Sie sich frei, um die Antwort zu aktualisieren :) –
Sicher, mit einem Beispiel hinzugefügt. –