(ancien fil, mais seulement 2 cents car aucun ne mentionne Guava ou d'autres bibliothèques et quelques autres détails)
Si vous le pouvez, utilisez la goyave
Il convient de souligner la manière Guava, qui simplifie considérablement ces manigances:
Usage
Pour une liste immuable
Utilisez la ImmutableList
classe et ses méthodes of()
et copyOf()
usine (les éléments ne peuvent pas être nuls) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Pour une liste Mutable
Utilisez la Lists
classe et ses newArrayList()
méthodes d'usine:
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
Veuillez également noter les méthodes similaires pour d'autres structures de données dans d'autres classes, par exemple dans Sets
.
L'attraction principale pourrait être de réduire l'encombrement dû aux génériques pour la sécurité des types, car l'utilisation des méthodes de l'usine de goyave permet de déduire les types la plupart du temps. Cependant, cet argument détient moins d'eau depuis l'arrivée de Java 7 avec le nouvel opérateur diamantaire.
Mais ce n'est pas la seule raison (et Java 7 n'est pas encore partout): la syntaxe raccourcie est également très pratique, et les initialiseurs de méthodes, comme vu ci-dessus, permettent d'écrire du code plus expressif. Vous faites dans un appel Guava ce qui prend 2 avec les collections Java actuelles.
Si vous ne pouvez pas ...
Pour une liste immuable
Utilisez la Arrays
classe du JDK et sa asList()
méthode d'usine, enveloppée par un Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Notez que le type retourné pour asList()
est une List
utilisation d'une ArrayList
implémentation concrète , mais il ne l'est PAS java.util.ArrayList
. C'est un type interne, qui émule un ArrayList
mais fait en fait directement référence au tableau passé et le fait "écrire" (les modifications sont reflétées dans le tableau).
Il interdit les modifications à travers certaines des List
méthodes de l' API en étendant simplement un AbstractList
(donc, l'ajout ou la suppression d'éléments n'est pas pris en charge), mais il permet aux appels set()
de remplacer les éléments. Ainsi, cette liste n'est pas vraiment immuable et un appel à asList()
devrait être terminé Collections.unmodifiableList()
.
Consultez l'étape suivante si vous avez besoin d'une liste modifiable.
Pour une liste Mutable
Comme ci-dessus, mais enveloppé d'un réel 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+
À des fins éducatives: Le bon vieux manuel
// 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);
}