Es ist zwar richtig, dass Sie nicht auf eine bestimmte Bestellung verlassen können, es sei denn die Map
Implementierung explizit definiert, gibt es einen Satz in the API documentation, die es bedeutet, ist eine einzige gemeinsame Ordnung für die Karte und alle seine Sammlung Ansichten:
die Reihenfolge einer Karte ist wie die Reihenfolge festgelegt, in dem die Iteratoren auf der Sammlung Ansichten der Karte ihre Elemente zurück.
(Hervorhebung von mir)
Für diese zufrieden zu sein, eine Karte eine inhärente Ordnung hat (auch wenn es nicht angegeben werden kann, und kann sich ändern, wenn die Karte geändert wird) und alle Sammlung Ansichten müssen entsprechen dieser Reihenfolge. Ob dies eine Garantie darstellt und insbesondere, ob alle Kartenimplementierungen von Drittanbietern dies gewährleisten, ist eine andere Frage.
Es ist auch erwähnenswert, dass diese in der Map
Schnittstelle als Ansichten explizit definiert, die von der Karte unterstützt werden, (zB wenn Sie ein Element aus den keySet
entfernen, wird die entsprechende Map
Eintrag muss von der entfernt werden Karte). Dies bedeutet in der Realität, dass es weniger wahrscheinlich ist, dass Sie von einer korrekten Map
-Implementierung andere Ordnungen erhalten, als wenn Sie beispielsweise flache Kopien der Sammlungsansichten erstellt hätten.
Nachdem all das gesagt wurde, wenn die Frage lautet: "Ist das ein sicherer Refactor?" dann lautet die Antwort "ja, solange der ursprüngliche Code nicht selbst gebrochen ist". Wenn die Methode auf einer bestimmten Reihenfolge und daher einer bestimmten Map
Implementierung basiert, sollte die Methode so deklariert werden, dass nur dieser Typ von Map
akzeptiert wird. Andernfalls haben Sie eine potentielle Zeitbombe, wenn die zugrundeliegende Map
Implementierung die Linie nach unten ändert (und ich habe gesehen, dass Software im wirklichen Leben deswegen mit einem JDK-Update bricht).
Wenn ein bestimmten Anrufer auf einer bestimmte Reihenfolge unter Berufung, weil sie es vorbei eine geordnete Map
Implementierung wissen, das ist in Ordnung und die Bestellung wird nach dem Refactoring erhalten bleiben.
Es scheint, die Frage im Titel und in Ihrem Beitrag ist nicht das Gleiche. Was willst du genau wissen? Wenn die Reihenfolge der Schlüssel zurückgibt, ist das gleiche wie die Reihenfolge der Werte?Oder wenn die Bestellung beim zweiten Anruf dieselbe ist wie beim ersten Anruf? – Tunaki
Sie sollten sich nicht auf die Reihenfolge der Iteration verlassen (es sei denn, Sie verwenden eine geordnete Map, z. B. TreeMap). Wenn Sie z. B. eine HashMap verwenden, geben sowohl "values ()" als auch "keySet()" für den aktuellen Status der Map die gleiche Iterationsreihenfolge an. Nach dem Hinzufügen von Elementen zur HashMap kann sich die Reihenfolge ändern. – Eran
@Tunaki Meine Frage ist, ob die Reihenfolge der Schlüssel die gleiche wie die Reihenfolge der Werte in dem Sinne ist, dass beide Code-Snippets Werte in der gleichen Reihenfolge verarbeiten würden. – Hulk