(stary wątek, ale tylko 2 centy, ponieważ nikt nie wspomina o Guava ani innych bibliotekach i niektórych innych szczegółach)
Jeśli możesz, użyj Guawy
Warto wskazać drogę Guava, która znacznie upraszcza te shenanigany:
Stosowanie
Dla niezmiennej listy
Użyj ImmutableList
klasy i jego of()
and copyOf()
fabryka metod (elementy nie mogą być puste) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Dla Zmiennej Listy
Użyj Lists
klasy i jej newArrayList()
metod fabrycznych:
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
Należy również zwrócić uwagę na podobne metody dla innych struktur danych w innych klasach, na przykład w Sets
.
Główną atrakcją może być zmniejszenie bałaganu ze względu na generyczne czynniki bezpieczeństwa typu, ponieważ zastosowanie fabrycznych metod Guava pozwala na wywnioskowanie typów przez większość czasu. Jednak ten argument zawiera mniej wody, odkąd Java 7 pojawiła się z nowym operatorem diamentów.
Ale to nie jedyny powód (a Java 7 nie jest jeszcze wszędzie): składnia skrócona jest również bardzo przydatna, a inicjalizatory metod, jak pokazano powyżej, pozwalają pisać bardziej ekspresyjny kod. Robisz w jednym wywołaniu Guava, co zajmuje 2 z bieżącymi kolekcjami Java.
Jeśli nie możesz ...
Dla niezmiennej listy
Użyj Arrays
klasy JDK i jej asList()
metody fabrycznej, opakowanej w Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Należy pamiętać, że zwracany typ na asList()
to List
stosując konkretną ArrayList
realizację, ale to nie jest java.util.ArrayList
. Jest to typ wewnętrzny, który emuluje, ArrayList
ale faktycznie bezpośrednio odwołuje się do przekazanej tablicy i sprawia, że „zapisuje” (modyfikacje są odzwierciedlane w tablicy).
Zabrania modyfikacji niektórych List
metod interfejsu API poprzez proste rozszerzenie AbstractList
(więc dodawanie lub usuwanie elementów nie jest obsługiwane), jednak umożliwia wywołanie set()
elementów zastępujących. Tak więc ta lista nie jest naprawdę niezmienne i wywołanie asList()
powinno być owinięte Collections.unmodifiableList()
.
Zobacz następny krok, jeśli potrzebujesz listy zmiennych.
Dla listy zmiennych
Taki sam jak powyżej, ale owinięty rzeczywistym 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+
Do celów edukacyjnych: The Good ol 'Manual Way
// 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);
}