2015-08-19 12 views
14

Sono abbastanza fuori dal mondo con la mia programmazione Java e sto facendo il corso di Udacity di Google come aggiornamento. Stavo seguendo la lezione 1 sull'app Sunshine dove il docente ha scelto di creare dati falsi dichiarando una serie di stringhe e quindi convertendole in una ArrayList.ArrayList Dichiarazione vs Conversione

Il codice è il seguente:

String[] data = { 
      "Mon 6/23 - Sunny - 31/17", 
      "Tue 6/24 - Foggy - 21/8", 
      "Wed 6/25 - Cloudy - 22/17", 
      "Thurs 6/26 - Rainy - 18/11", 
      "Fri 6/27 - Foggy - 21/10", 
      "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18", 
      "Sun 6/29 - Sunny - 20/7" 
    }; 
    List<String> weatherForecast = new ArrayList<>(Arrays.asList(data)); 

Mi chiedevo c'è qualche vantaggio di utilizzare questo metodo di conversione? Perché non dichiarare immediatamente i dati come ArrayList come tali:

ArrayList weatherForecast = new ArrayList(); 
    weatherForecast.add("Today - Sunny - 88/63"); 
    weatherForecast.add("Tomorrow - Foggy = 70/46"); 
    weatherForecast.add("Weds - Cloudy - 72/63"); 
    weatherForecast.add("Thurs 6/26 - Rainy - 18/11"); 
    weatherForecast.add("Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18"); 
    weatherForecast.add("Sun 6/29 - Sunny - 20/7"); 

Grazie!

+0

Forse il docente voleva solo dimostrare che è possibile convertire prontamente tra array e liste usando l'API Collections. ArrayList utilizza un array sotto le copertine. In alcune circostanze (ma non questa) è possibile ottenere un piccolo vantaggio in termini di prestazioni dall'uso di un array, ma le liste forniranno molte più funzionalità. Quindi nessuna grande differenza, dipende da cosa intendi fare con esso. Potresti voler lavorare con un array piuttosto che con un elenco, finché non avrai bisogno di alcune delle funzionalità che un elenco fornirà su un array. – Nio

+0

Dichiarazioni di array aggregate come questa vengono eseguite per creare un'istanza di una matrice di dati statici, mentre le liste implicano una forma dinamica e anche un parametro molto più probabile per una chiamata di metodo rispetto a una matrice. Convertire da uno all'altro è come dire "Ora è costante, ma ci aspettiamo di ricevere una lista nello sviluppo futuro". Almeno questo è come l'ho letto. Aggiungere i dati direttamente a un ArrayList equivale a mettere '! tag importanti 'accanto alle regole nei file css. In altre parole, un po 'grezzo, anche se funziona.;) – Neil

risposta

13

Il modo "normale" sarebbe quella di utilizzare una terza forma:

List<String> weatherForecast = new ArrayList<>(); 
Collections.addAll(weatherForecast, 
     "Mon 6/23 - Sunny - 31/17", 
     "Tue 6/24 - Foggy - 21/8", 
     "Wed 6/25 - Cloudy - 22/17", 
     "Thurs 6/26 - Rainy - 18/11", 
     "Fri 6/27 - Foggy - 21/10", 
     "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18", 
     "Sun 6/29 - Sunny - 20/7"); 

List è un'interfaccia, usando che permetta di utilizzare un'altra classe implementaton come LinkedList (solo per un paio di elementi). Utile anche come tipo di parametro.

Questo utilizza la classe di utilità Collezioni per aggiungere vararghe ... stringhe. E usa sotto il cofano uno String[] per quegli args.

Il .asList della prima opzione sarebbe sufficiente per non aggiungere uno List<String>.

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ entrambi gli stili possono essere trovati nel codice vecchio stile, il primo un po 'più recente, ma più circostanziato. Il secondo più diretto, ma troppo prolisso. –

+0

Non c'è niente di sbagliato in questo modo, ma personalmente preferisco la conversione da un array nel primo esempio di OP. – Neil

1

Non vi è alcun vantaggio speciale.

Nel primo caso si esegue il wrapping inutile dell'array creato da Arrays.asList() come nuovo array.

Utilizzare il secondo caso, a condizione che il contenuto dell'array sia statico.

+0

Direi che il "vantaggio" è che devi scrivere meno codice usando il primo approccio ... Se può essere chiamato "vantaggio" – BackSlash

+0

@BackSlash Non sembra alcun vantaggio per me in questo caso :) –

+0

In realtà Arrays.asList restituisce una lista con struttura di sola lettura .. non è possibile aggiungere o rimuovere dalla lista. . Inoltre, Arrays.asList non restituisce java.util.arraylist. restituisce java.util.arrays $ arraylist. Questo è importante perché i controlli dell'istanza di Coz potrebbero fallire – TheLostMind

5

Entrambi fanno la stessa cosa.

Ma la differenza è che il primo lo rende più leggibile. Sapresti esattamente che stai aggiungendo le informazioni di weatherforecast a un elenco.

Nel secondo caso si continua ad aggiungere informazioni, utilizzando add(), questo in realtà sembra un po 'maldestro rispetto agli altri.

consideri che si sta aggiungendo numeri primi di un elenco

First Approach: 
int [] primeNums = {2, 3, 5, 7, 11, 13, 17, 19}; 
List<Integer> primes = new ArrayList<>(Arrays.asList(primeNums)); 

Second Approach: 
List<Integer> primes = new ArrayList<>(); 
primes.add(2); 
primes.add(3); 
primes.add(5); 
primes.add(7); 
primes.add(11); 
primes.add(13); 
primes.add(17); 
primes.add(19); 

Inoltre potreste scorrere l'array e aggiungerlo.

for(int i = 0; i < primeNums.length; ++i) 
    primes.add(primeNums[i]); 
2

Entrambi stanno facendo la stessa cosa; ma la leggibilità del codice è importante;

consideri un example--

Un'applicazione è consentito mettere valori in array FINO massima capacità e come per this link, massimo Integer.MAX_VALUE - 5 valori possono essere ammessi in matrice. Una volta compilato l'array, lo sviluppatore deve convertirlo in List come si fa sopra.

Ora, pensate se qualcuno usa il metodo add in questa situazione, quindi le linee di codice definitive cresceranno e il codice diventerà difficile da leggere.

Quindi, in questa situazione, l'utilizzo preferito sarebbe utilizzando Arrays.asList(data);

3

Per quanto riguarda le prestazioni, la risposta potrebbe essere migliore perché si crea un'istanza di una sola struttura di dati (ArrayList) e si aggiungono i propri elementi. Fatta eccezione per la parte di leggibilità, il tuo istruttore crea un'istanza di entrambi gli array e quindi la ricopre in una lista di array che è una matrice crescente. Potrebbe non essere un grande successo per le prestazioni, ma la tua è sicuramente una performance più veloce.

+0

Per quanto riguarda le prestazioni, sarà più lento quando si copiano tutti i dati, mentre la prima opzione restituisce un wrapper dell'array e non lo copia. –

5

Primo approccio:

  • una migliore leggibilità (può essere ancora meglio, vedere la mia alternativa); tutti i dati sono separati direttamente da una virgola invece di avere una chiamata al metodo per aggiungerli.
  • Arrays.asList Creare un dimensione fissa elenco per il dato array specifico utilizzo interno ArrayList classe che è solo un involucro intorno alla matrice stessa che lo rendono più efficiente quindi creando una copia completa della matrice.
  • È possibile mantenere i dati in una variabile List anziché in una variabile ArrayList che offre maggiore flessibilità.

Secondo approccio:

  • si utilizzano tipi di prime, che è male all'inizio.
  • Nessun vantaggio.

favore, se si utilizza questo approccio, almeno dichiarare la vostra List in modo generico:

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

Alternativa:

Nota che si potrebbe direttamente fare:

List<String> weatherForecast = Arrays.asList(
    "Mon 6/23 - Sunny - 31/17", 
    "Tue 6/24 - Foggy - 21/8", 
    "Wed 6/25 - Cloudy - 22/17", 
    "Thurs 6/26 - Rainy - 18/11", 
    "Fri 6/27 - Foggy - 21/10", 
    "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18", 
    "Sun 6/29 - Sunny - 20/7" 
); 
+0

L'utente ha specificato per primo e alla fine l'ha usato come alternativa. Sono confuso :) –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ L'ho specificato, ma mai qualificato come pro/contro; ha solo bisogno di essere usato come dovrebbe. Presumo che se il docente lo usa, non c'è alcun problema con il fatto che è immutabile. Considerando questo, ho dato un'alternativa che fa lo stesso in un modo più leggibile. –