2012-03-26 12 views
10

Mi chiedo perché hanno progettato il metodo toArray in ArrayList per prendere un input di un array in Java?Metodo ArrayList.toArray() in Java

ArrayList<String> listArray = new ArrayList<String>(); 

    listArray.add("Germany"); 
    listArray.add("Holland"); 
    listArray.add("Sweden"); 

    String []strArray = new String[3]; 
    String[] a = (String [])listArray.toArray(strArray); 

A me sembra che, non hanno bisogno di questo ingresso perché l'istanza del ArrayList stessa ha abbastanza dettagli per convertire i dati in un array.

La mia domanda è: perché hanno ancora bisogno di passare la matrice? Grazie.

risposta

13

due ragioni mi viene in mente:

  1. cancellazione significa che i parametri generici non sono disponibili in fase di esecuzione, quindi un ArrayList<String> non sa che contiene stringhe, è solo il tipo grezzo ArrayList. Pertanto tutte le invocazioni di toArray() devono restituire un Object[], che non è strettamente corretto. Dovresti effettivamente creare un secondo array di String[] quindi iterare sul primo, eseguendo a turno tutti i suoi parametri per uscire con il tipo di risultato desiderato.
  2. Il modo in cui viene definito il metodo indica che è possibile passare un riferimento a un array esistente e inserirlo tramite il metodo. In alcuni casi questo è probabilmente molto conveniente, piuttosto che avere un nuovo array restituito e quindi copiarne i valori altrove.
+0

Grazie, ho capito. Nel mio esempio, dovrei assumere "strArray" o "a" come risultato finale? Sono uguali? –

+4

Sono uguali, _if_ 'collection.size() <= strArray.size()', che è vero nel tuo caso specifico. In genere è meglio usare comunque 'a'. –

+0

@LouisWasserman Grazie. –

0

È così che quando si dispone di una matrice non vuota alla quale si desidera aggiungere l'oggetto dalla conversione dell'array, è possibile farlo senza dover creare una nuova matrice e eseguire l'elaborazione successiva della fusione, salvare la risorsa e lavoro extra.

leggere il secondo paragrafo del javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (T [])

1

avete bisogno di ottenere i tipi di matrice diversi da Object[]. listArray.toArray(new String[3]) in realtà non dovrebbe essere necessario un cast per String[], ma consente di scrivere negli array per tipi specifici, piuttosto che l'approccio (piuttosto pericoloso) di trasmettere semplicemente Object[] a qualunque sia il tuo tipo.

0

Non è obbligatorio passare la matrice come argomento a toArray(), è possibile chiamare direttamente arrayList.toArray()

Come sappiamo che struttura di raccolta con i generici lavora con il concetto di Tipo Erasure. Quindi la listaArea diventa una lista di oggetti, quindi quando convertite in array darà un oggetto Object [] se non passate alcun argomento.

0

ArrayList non dispone di informazioni sufficienti dato che il "dato" stesso è memorizzato in segmenti di array Object. Quindi, se si conosce il "tipo" di elementi presenti nell'elenco di array, è possibile ottenere la sicurezza del tipo utilizzando questa variante del metodo toArray.

-1

Poiché la matrice in cui devono essere copiati gli elementi deve essere specificata nella JVM.

See this documentation

2

Nel codice, il ArrayList può contenere qualsiasi cosa, non solo le stringhe. Si potrebbe riscrivere il codice per:

ArrayList<String> listArray = new ArrayList<String>(); 

listArray.add("Germany"); 
listArray.add("Holland"); 
listArray.add("Sweden"); 

String []strArray = new String[3]; 
String[] a = listArray.toArray(strArray); 

Tuttavia, in array Java contengono il loro tipo di contenuto (String) in fase di esecuzione, mentre i generici vengono cancellati dal compilatore, quindi c'è ancora alcun modo per il sistema di runtime per sapere che dovrebbe creare un codice String[] nel codice.