2012-02-27 16 views
13

Ho un java ArrayList a cui aggiungo 5 oggetti.Ordine di recupero elenco array

Se si scorre l'elenco e li si stampa, quindi scorrere l'elenco e stamparli di nuovo.

L'ordine di recupero in questi 2 casi sarà lo stesso? (So ​​che potrebbe essere diverso dall'ordine di inserimento)

risposta

22

Sì, presupponendo di non aver modificato l'elenco intermedio. Da http://docs.oracle.com/javase/6/docs/api/java/util/List.html:

iteratore

Iterator<E> iterator()

restituisce un iteratore sugli elementi di questo elenco nella sequenza corretta.

Un po 'vago, forse, ma in altre porzioni di quella pagina, si definisce questo termine:

sequenza corretta (dal primo all'ultimo elemento)

+1

Avrebbero potuto fare meglio che dichiarare "sequenza corretta" :-) –

+4

@ TheNail - Beh, i documenti per 'Elenco' dicono subito all'inizio che un' Elenco' è "Una raccolta ordinata (noto anche come _sequenza_)." –

2

Se non si modifica l'elenco, l'ordine di iterazione rimane invariato. Le liste hanno un ordine specificato contrattualmente e la specifica iterator garantisce che itera su elementi in tale ordine.

-2

Anche insiemi torneranno lo stesso risultato, se non li modifichi (aggiungendo o rimuovendo oggetti a loro).

+2

In pratica questo è spesso vero, ma non è garantito (tranne per SortedSet!). In teoria potresti incontrare un Set che riorganizza la sua struttura interna dietro le quinte ... – DNA

+2

Non c'è alcuna garanzia che un Set non si riorganizzerà internamente in qualsiasi momento. Non vi è alcuna garanzia che le iterazioni impostate siano in un ordine particolare o che l'ordine non cambi da un iteratore a quello successivo. –

+0

Vedi anche questa domanda * correlata ma non uguale * SO e la sua risposta: http://stackoverflow.com/questions/2704597/iteration-order-of-hashset –

6

È nelle specifiche dell'interfaccia List per conservare l'ordine.

Sono le classi Set che non conservano l'ordine.

1

Il recupero non varia a meno che non venga modificato l'iteratore in uso. Finché si utilizza lo stesso metodo per il recupero e non si è modificato l'elenco stesso, gli articoli verranno restituiti nello stesso ordine.

1

Quando si aggiunge un elemento a un ArrayList utilizzando add(E e), l'elemento viene aggiunto alla fine dell'elenco. Di conseguenza, se tutto ciò che si fa è chiamare il metodo single-argument add un numero di volte e quindi iterare, l'iterazione sarà esattamente nello stesso ordine delle chiamate a add.

1

L'ordine di iterazione sarà lo stesso ogni volta che si scorre sullo stesso elenco non modificato.

Inoltre, supponendo che si aggiungono gli elementi utilizzando il metodo add(), l'ordine di iterazione sarà essere lo stesso come l'ordine di inserimento dal momento che questo metodo aggiunge elementi alla fine dell'elenco.

10

(So che può essere diverso da quello dell'ordine di inserimento)

No non lo farà.Il contratto di List richiede che l'ordine add sia uguale all'ordine di iterazione, dal momento che gli inserimenti add alla fine e iterator produce un iteratore che itera da inizio a fine in ordine.

Set non richiede questo, quindi si può confondere il contratto di Set e per quanto riguarda l'ordine di iterazione.

Dal Javadoc:

Iterator<E> iterator()

restituisce un iteratore sugli elementi di questo elenco nella sequenza corretta.

2

Sì, un ArrayList garanzie di iterazione ordine sopra i suoi elementi - cioè, usciranno nello stesso ordine in cui li inserito, a condizione che non si fanno alcun inserimenti, mentre l'iterazione sulla ArrayList.

-1

Sì, l'ordine di recupero è garantito come uguale a quando l'elenco non è mutato e si utilizza lo stesso iteratore, ma dovendo fare affidamento sull'ordine di recupero indicato qualcosa di sospetto con il disegno. Generalmente non è una buona idea basare la logica aziendale su determinati ordini di recupero.

+0

Questa risposta è praticamente una ripetizione delle risposte esistenti. –

Problemi correlati