(alter Thread, aber nur 2 Cent, da keiner Guava oder andere Bibliotheken und einige andere Details erwähnt)
Wenn Sie können, verwenden Sie Guave
Es lohnt sich, auf den Guaven-Weg hinzuweisen, der diese Spielereien erheblich vereinfacht:
Verwendungszweck
Für eine unveränderliche Liste
Verwenden Sie die ImmutableListKlasse und ihre of()und copyOf()Factory-Methoden (Elemente dürfen nicht null sein) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Für eine veränderbare Liste
Verwenden Sie die ListsKlasse und ihre newArrayList()Factory-Methoden:
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
Bitte beachten Sie auch die ähnlichen Methoden für andere Datenstrukturen in anderen Klassen, zum Beispiel in Sets.
Die Hauptattraktion könnte darin bestehen, die Unordnung aufgrund von Generika für die Typensicherheit zu verringern, da durch die Verwendung der Guava- Fabrikmethoden die Typen die meiste Zeit abgeleitet werden können. Dieses Argument enthält jedoch weniger Wasser, da Java 7 mit dem neuen Diamantoperator eingetroffen ist.
Dies ist jedoch nicht der einzige Grund (und Java 7 ist noch nicht überall): Die Kurzschrift-Syntax ist ebenfalls sehr praktisch, und die oben beschriebenen Methodeninitialisierer ermöglichen das Schreiben von aussagekräftigerem Code. Sie tun in einem Guava-Aufruf, was mit den aktuellen Java-Sammlungen 2 dauert.
Wenn Sie nicht können ...
Für eine unveränderliche Liste
Verwenden Sie die ArraysKlasse des JDK und seine asList()Factory-Methode, die mit einem Collections.unmodifiableList():
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Beachten Sie, dass der zurückgegebene Typ für asList()eine Listkonkrete Verwendung ArrayListImplementierung, aber es ist nicht java.util.ArrayList . Es ist ein innerer Typ, der ein emuliertes ArrayListArray emuliert, aber tatsächlich direkt auf das übergebene Array verweist und es zum "Durchschreiben" bringt (Änderungen werden im Array wiedergegeben).
Es verbietet Änderungen durch einige der ListAPI-Methoden durch einfaches Erweitern von a AbstractList(daher wird das Hinzufügen oder Entfernen von Elementen nicht unterstützt), ermöglicht jedoch Aufrufen, set()Elemente zu überschreiben. Daher ist diese Liste nicht wirklich unveränderlich und ein Aufruf an asList()sollte mit abgeschlossen werden Collections.unmodifiableList().
Lesen Sie den nächsten Schritt, wenn Sie eine veränderbare Liste benötigen.
Für eine veränderbare Liste
Wie oben, jedoch mit einem tatsächlichen 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+
Für Bildungszwecke: Der gute alte manuelle Weg
// 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);
}