De la Java des Collections de Conception d'API FAQ:
Pourquoi ne pas la Carte d'étendre la Collecte?
C'est par la conception. Nous avons le sentiment que
mappages ne sont pas des collections et de la
les collections ne sont pas des mappages. Ainsi, il
peu de sens pour la Carte d'étendre
l'interface de Collecte (ou vice
versa).
Si une Carte est une Collection, ce sont les
éléments? La seule réponse raisonnable
est "paires Clé-valeur", mais ce
fournit un très limitées (et non pas
particulièrement utile) de la Carte de l'abstraction.
Vous ne pouvez pas demander à ce que la valeur d'une clé
cartes à, et vous ne pouvez pas supprimer l'entrée
pour une clé donnée, sans savoir ce que
valeur des cartes.
Collection pourrait être déployés pour étendre
La carte, mais cela soulève la question:
quelles sont les clés? Il n'y a pas vraiment
réponse satisfaisante, et en forçant un
conduit à un manque de naturel de l'interface.
Les cartes peuvent être considérées comme des Collections (de
clés, les valeurs, ou les couples), et de ce fait
se reflète dans les trois "Collection
opérations de vues" sur les Cartes (jeu de clés,
entrySet, et les valeurs). Alors qu'il est, dans
principe, possible d'afficher une Liste de
une Carte cartographie des indices à des éléments,des
c'est le méchant de la propriété que
la suppression d'un élément de la Liste
change la Clé associée à chaque
élément avant de l'élément supprimé.
C'est pourquoi nous n'avons pas une vue de la carte
opération sur les Listes.
Mise à jour: je pense que la citation répond à la plupart des questions. Il est important de souligner la partie sur une collection d'entrées n'étant pas particulièrement utile de l'abstraction. Par exemple:
Set<Map.Entry<String,String>>
permettrait:
set.add(entry("hello", "world"));
set.add(entry("hello", "world 2");
(en supposant un entry()
méthode qui crée un Map.Entry
exemple)
Map
s nécessite des clés uniques, donc ce serait en violation de cette. Ou si vous imposez des clés uniques sur un Set
des entrées, il n'est pas vraiment un Set
dans le sens général. C'est un Set
avec d'autres restrictions.
Sans doute on pourrait dire le equals()
/hashCode()
relation pour Map.Entry
a été purement sur la clé, mais même qui a des problèmes. Plus important encore, est-il vraiment ajouter de la valeur? Vous pouvez trouver cette abstraction pauses vers le bas une fois que vous commencez à regarder le cas du coin.
Il est intéressant de noter que l' HashSet
est effectivement mis en œuvre comme un HashMap
, et non pas l'inverse. Ce n'est qu'un détail d'implémentation, mais est néanmoins intéressants.
La raison principale pour entrySet()
d'exister est de simplifier la traversée de sorte que vous n'avez pas à parcourir les touches et puis faire une recherche de la clé. Ne le prenez pas comme une preuve prima facie que l' Map
devrait être un Set
des entrées (à mon humble avis).