Ci sono due aspetti di questa domanda che ho ritenuto fossero troppo strettamente correlati a porre domande separate.
- Perché
SortedMap
non implementaIterable<Map.Entry<K,V>>
?
Se è necessario eseguire un'azione su ogni coppia chiave-valore in una mappa, iterare su entrySet () sembra la strada da percorrere. Quindi, perché non fornire un metodo diretto iterator () su SortedMap? A meno che non siate preoccupati che l'ordine di iterazione sia incoerente in una HashMap. Il che mi porta a:
- L'implementazione di
Iterable
implica un ordine stabile?
L'iterazione su una raccolta ordinata (Elenco, SortedMap, SortedSet) è un ottimo modo per implementare in modo affidabile equals () (vedi Nota 1) e fare altre cose che devono produrre lo stesso risultato ogni volta. L'iterazione su una serie o mappa non ordinata potrebbe produrre ordini diversi se la chiami più volte, quindi non è adatta a tali scopi. Soprattutto se stai confrontando HashSets o HashMaps - due di loro potrebbero contenere gli stessi oggetti, ma l'ordine dei loro iteratori sarebbe diverso.
Suppongo che ci siano 2 aspetti in queste domande:
-
Quali sono i motivi storici di queste decisioni di progettazione?
-
Se lo fai di nuovo oggi, ci sono risposte corrette a queste domande? Forse
OrderedIterable
dovrebbe estendereIterable
per garantire l'ordine?
Note:
- Inizialmente avevo suggerito che era necessario un ordinamento affidabile per implementare hashCode (), ma se si sommano tutti gli hashcode, risulta che non è necessario un ordinamento affidabile se l'algoritmo di hashing è commutativo. L'addizione è comunemente usata per hashCode ed è commutativa: a + b = b + a e B. anche con overflow, l'addizione è ancora commutativa in modo che un + Integer.MAX_VALUE = Integer.MAX_VALUE + a. Hai ancora bisogno di un ordine affidabile per implementare equals () in modo da poter confrontare il primo elemento di uno con il primo elemento dell'altro, ecc.
P.S.
Questa domanda riguarda le interfacce Iterable
, Set
, SortedSet
, Map
e SortedMap
. Va bene visualizzare altre interfacce come esempi, ma
Non penso che l'interfaccia Collection
sia rilevante per questa domanda. È stravagante e ha il potenziale per essere una distrazione.