(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 ImmutableList
Klasse 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 Lists
Klasse 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 Arrays
Klasse 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 List
konkrete Verwendung ArrayList
Implementierung, aber es ist nicht java.util.ArrayList
. Es ist ein innerer Typ, der ein emuliertes ArrayList
Array 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 List
API-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);
}