Aus den häufig gestellten Fragen zum Java Collections API Design :
Warum erweitert Map die Sammlung nicht?
Dies war beabsichtigt. Wir sind der Meinung, dass Zuordnungen keine Sammlungen sind und Sammlungen keine Zuordnungen. Daher ist es für Map wenig sinnvoll, die Sammlungsschnittstelle zu erweitern (oder umgekehrt).
Wenn eine Karte eine Sammlung ist, welche Elemente gibt es? Die einzig vernünftige Antwort ist "Schlüssel-Wert-Paare", dies bietet jedoch eine sehr begrenzte (und nicht besonders nützliche) Kartenabstraktion. Sie können weder fragen, welchem Wert ein bestimmter Schlüssel zugeordnet ist, noch den Eintrag für einen bestimmten Schlüssel löschen, ohne zu wissen, welchem Wert er zugeordnet ist.
Eine Sammlung könnte gemacht werden, um die Karte zu erweitern, aber dies wirft die Frage auf: Was sind die Schlüssel? Es gibt keine wirklich zufriedenstellende Antwort, und das Erzwingen einer Antwort führt zu einer unnatürlichen Schnittstelle.
Karten können als Sammlungen (von Schlüsseln, Werten oder Paaren) angezeigt werden. Diese Tatsache spiegelt sich in den drei "Sammlungsansichtsoperationen" in Karten wider (keySet, entrySet und Werte). Während es im Prinzip möglich ist, eine Liste als Map-Zuordnungsindizes zu Elementen anzuzeigen, hat dies die böse Eigenschaft, dass das Löschen eines Elements aus der Liste den Schlüssel ändert, der jedem Element vor dem gelöschten Element zugeordnet ist. Aus diesem Grund haben wir keine Kartenansicht in Listen.
Update: Ich denke, das Zitat beantwortet die meisten Fragen. Es lohnt sich, den Teil zu betonen, dass eine Sammlung von Einträgen keine besonders nützliche Abstraktion ist. Beispielsweise:
Set<Map.Entry<String,String>>
würde erlauben:
set.add(entry("hello", "world"));
set.add(entry("hello", "world 2");
(unter der Annahme einer entry()Methode, die a erstelltMap.Entry Instanz erstellt)
Maps erfordern eindeutige Schlüssel, damit dies verletzt wird. Oder wenn Sie einem SetEintrag eindeutige Schlüssel auferlegen , ist dies Setim Allgemeinen kein wirklicher . Es ist einSet mit weiteren Einschränkungen.
Man könnte wohl die equals()/ hashCode()Beziehung für sagenMap.Entry nur der Schlüssel war, aber selbst das hat Probleme. Was noch wichtiger ist: Fügt es wirklich einen Mehrwert hinzu? Möglicherweise bricht diese Abstraktion zusammen, wenn Sie sich die Eckfälle ansehen.
Es ist erwähnenswert, dass das HashSettatsächlich als implementiert istHashMap , nicht umgekehrt. Dies ist lediglich ein Implementierungsdetail, aber dennoch interessant.
Der Hauptgrund für entrySet()die Existenz besteht darin, das Durchlaufen zu vereinfachen, sodass Sie die Schlüssel nicht durchlaufen und dann den Schlüssel nachschlagen müssen. Nehmen Sie es nicht als Anscheinsbeweis dafür, dass a Mapein SetEintrag sein sollte (imho).