(vecchio thread, ma solo 2 centesimi poiché nessuno menziona Guava o altre librerie e altri dettagli)
Se puoi, usa Guava
Vale la pena sottolineare il modo Guava, che semplifica notevolmente questi shenanigans:
uso
Per un elenco immutabile
Usa la ImmutableList
classe e i suoi metodi of()
e copyOf()
factory (gli elementi non possono essere nulli) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Per un elenco mutevole
Usa la Lists
classe e i suoi newArrayList()
metodi di fabbrica:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Nota anche metodi simili per altre strutture di dati in altre classi, ad esempio in Sets
.
L'attrazione principale potrebbe essere quella di ridurre il disordine dovuto ai generici per la sicurezza del tipo, come l'uso dei metodi di fabbrica della Guava consente di dedurre i tipi per la maggior parte del tempo. Tuttavia, questo argomento contiene meno acqua da quando Java 7 è arrivato con il nuovo operatore Diamond.
Ma non è l'unico motivo (e Java 7 non è ancora dappertutto): anche la sintassi abbreviata è molto utile e gli inizializzatori dei metodi, come visto sopra, consentono di scrivere codice più espressivo. Fai in una chiamata Guava ciò che richiede 2 con le attuali Collezioni Java.
Se non puoi ...
Per un elenco immutabile
Usa la Arrays
classe JDK e il suo asList()
metodo factory, racchiuso in un Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Si noti che il tipo restituito per asList()
è un'implementazione List
concreta che ArrayList
utilizza, ma NON lo è java.util.ArrayList
. È un tipo interiore, che emula unArrayList
ma in realtà fa direttamente riferimento all'array passato e lo fa "scrivere attraverso" (le modifiche si riflettono nell'array).
Proibisce modifiche attraverso alcuni dei List
metodi dell'API semplicemente estendendo un AbstractList
(quindi, l'aggiunta o la rimozione di elementi non è supportata), tuttavia consente alle chiamate set()
di sovrascrivere gli elementi. Quindi questa lista non è veramente immutabile e asList()
dovrebbe essere racchiusa una chiamata a Collections.unmodifiableList()
.
Vedere il passaggio successivo se è necessario un elenco modificabile.
Per un elenco mutevole
Come sopra, ma avvolto con un effettivo java.util.ArrayList
:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
Per scopi educativi: il buon vecchio modo manuale
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}