Y a-t-il un meilleur moyen d'y parvenir?
public static List<String> toList(String[] array) {
List<String> list = new ArrayList(array.length);
for(int i=0; i<array.length; i++)
list.add(array[i]);
return list;
}
REMARQUE: Arrays.asList (a) Retourne une liste de taille fixe sauvegardée par le tableau spécifié. (Modifications apportées à la liste renvoyée "write through" dans le tableau.). Je ne veux pas ce comportement. Je suppose que MA fonction ci-dessus contourne cela (ou est-ce que je me trompe?)
Donc, nous avons ici la méthode alternative:
public static List<String> toList(String[] array) {
List<String> list = new ArrayList(array.length);
list.addAll(Arrays.asList(array));
return list;
}
Juste en le regardant, Je ne crois pas que ce soit plus rapide que la première méthode .
Qu'entendez-vous par meilleur moyen:
plus lisible:
List<String> list = new ArrayList<String>(Arrays.asList(array));
moins de consommation de mémoire, et peut-être plus rapide (mais certainement pas thread-safe):
public static List<String> toList(String[] array) {
if (array==null) {
return new ArrayList(0);
} else {
int size = array.length;
List<String> list = new ArrayList(size);
for(int i = 0; i < size; i++) {
list.add(array[i]);
}
return list;
}
}
Btw: voici un bug dans votre premier exemple:
array.length
lève une exception de pointeur null si array est null, la vérification if (array!=null)
doit donc être effectuée en premier.
Arrays.asList(array);
Exemple:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
Voir Arrays.asList
documentation de la classe.
Arrays.asList(array)
Arrays
utilise new ArrayList(array)
. Mais ce n'est pas le Java.util.ArrayList
. C'est très similaire cependant. Notez que ce constructeur prend le tableau et le place comme tableau de sauvegarde de la liste. Donc, c'est O(1)
.
Si vous avez déjà créé la liste, Collections.addAll(list, array)
, mais cela est moins efficace.
Mise à jour: Ainsi, votre Collections.addAll(list, array)
devient une bonne option. Un emballage de celui-ci est la Lists.newArrayList(array)
de la goyave.
Une autre façon de le faire:
Collections.addAll(collectionInstance,array);
Qu'en est-il de :
List myList = new ArrayList();
String[] myStringArray = new String[] {"Java", "is", "Cool"};
Collections.addAll(myList, myStringArray);
Vous pouvez utiliser:
list.addAll(Arrays.asList(array));
Vous pouvez essayer quelque chose comme ça:
List<String> list = new ArrayList<String>(Arrays.asList(array));
public ArrayList (Collection c)
Construit une liste contenant le éléments de la collection spécifiée, dans l'ordre dans lequel ils sont retournés par le itérateur de la collection. La liste de tableaux instance a une capacité initiale de 110% de la taille de la spécifiée collection.
Tiré de ici
Avez-vous vérifié Arrays.asList()
; voir API
Oui il y a. Vous pouvez utiliser la classe Arrays du package Java.util. *. Ensuite, il s’agit en fait d’une seule ligne de code.
List<String> list = Arrays.asList(array);
Basé sur la référence de Java.util.Collections.addAll(Collection<? super String> c, String... elements)
, sa mise en œuvre est similaire à votre première méthode, elle dit
Ajoute tous les éléments spécifiés à la collection spécifiée. Les éléments à ajouter peuvent être spécifiés individuellement ou sous forme de tableau. Le comportement de cette méthode pratique est identique à celui de c.addAll (Arrays.asList (elements)), mais cette méthode est susceptible de s'exécuter beaucoup plus rapidement dans la plupart des implémentations.
Son implémentation dans jdk est (jdk7)
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
Donc, parmi vos exemples, la meilleure approche doit être Collections.addAll(list, array);
Depuis Java 8, on peut utiliser Stream
api qui peut mieux fonctionner
Par exemple:-
String[] array = {"item1", "item2", "item3"};
Stream<String> stream = Stream.of(array);
//if the array is extremely large
stream = stream.parallel();
final List<String> list = stream.collect(Collectors.toList());
Si le tableau est très grand, nous pouvons le faire comme une opération batch en parallèle en utilisant un flux parallèle (stream = stream.parallel()
) qui utilisera tous les processeurs pour terminer la tâche rapidement. Si la longueur de la matrice est très petite, le flux parallèle prendra plus de temps que le flux séquentiel.