Ont fait cette réponse avec une approche mise à jour avec JDK-11 introduisant une nouvelle API tout aussi performante toArray(T[])et similaire en syntaxe Stream.toArray.
Naman
Réponses:
1792
List<String> list =..;String[] array = list.toArray(newString[0]);
Par exemple:
List<String> list =newArrayList<String>();//add some stuff
list.add("android");
list.add("apple");String[] stringArray = list.toArray(newString[0]);
La toArray()méthode sans passer aucun argument renvoie Object[]. Vous devez donc passer un tableau comme argument, qui sera rempli avec les données de la liste et renvoyé. Vous pouvez également passer un tableau vide, mais vous pouvez également passer un tableau avec la taille souhaitée.
Mise à jour importante : à l'origine le code ci-dessus utilisé new String[list.size()]. Cependant, ce blog révèle qu'en raison des optimisations JVM, l'utilisation new String[0]est meilleure maintenant.
cela permet d'économiser une instnation de baie supplémentaire
Bozho
59
Il s'avère que fournir un tableau de longueur nulle, même le créer et le jeter, est en moyenne plus rapide que d'allouer un tableau de la bonne taille. Pour les repères et les explications, voir ici: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks
2
(Désolé. Question rhétorique. La réponse est, bien sûr, parce que Java ne fait pas de vrais génériques; il les
simule
3
@lyuboslavkanev Le problème est qu'avoir le type générique en Java n'est pas suffisant pour créer réellement des objets basés sur ce type; pas même un tableau (ce qui est ridicule, car cela devrait fonctionner pour tout type). Pour autant que je sache, tout ce qui peut être fait est de lancer. En fait, pour même créer des objets du type, vous devez avoir l' Classobjet réel , ce qui semble être complètement impossible à dériver du type générique. Comme je l'ai dit, la raison en est que toute la construction est fausse; tout est simplement stocké sous forme d'objet en interne.
Je préférerais cette syntaxe, mais IntelliJ affiche une erreur de compilation avec cela, se plaint "T [] n'est pas une interface fonctionnelle."
Glen Mazza
3
@GlenMazza que vous ne pouvez utiliser que toArraysur un Streamobjet. Cette erreur de compilation peut se produire si vous réduisez le flux à l'aide de a Collectorspuis essayez d'appliquer toArray.
Udara Bentota
39
Vous pouvez utiliser la toArray()méthode pour List:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array = list.toArray(newString[list.size()]);
Ou vous pouvez ajouter manuellement les éléments à un tableau:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array =newString[list.size()];for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}
List<String> list =List.of("x","y","z");String[] arrayBeforeJDK11 = list.toArray(newString[0]);String[] arrayAfterJDK11 = list.toArray(String[]::new);// similar to Stream.toArray
Cela fonctionne, mais n'est pas super efficace, et duplique la fonctionnalité dans la réponse acceptée avec du code supplémentaire.
Alan Delimon
5
dans le cas où une manipulation supplémentaire des données est souhaitée, pour laquelle l'utilisateur souhaite une fonction, cette approche n'est pas parfaite (car elle nécessite de passer la classe de l'élément comme deuxième paramètre), mais fonctionne:
Si votre application utilise déjà la bibliothèque Apache Commons, vous pouvez légèrement modifier la réponse acceptée pour ne pas créer un nouveau tableau vide à chaque fois:
List<String> list =..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);
Il existe quelques autres tableaux vides préalloués de différents types dans ArrayUtils .
Nous pouvons aussi tromper JVM pour créer un tableau vide pour nous de cette façon:
String[] array = list.toArray(ArrayUtils.toArray());// or if using static importString[] array = list.toArray(toArray());
Mais il n'y a vraiment aucun avantage de cette façon, juste une question de goût, OMI.
J'ai rétrogradé parce que: 1. pas d'utilisation de génériques qui vous forcent à 2. utiliser .toString()là où aucun transtypage explicite ne serait nécessaire, 3. vous n'incrémentez même pas i, et 4. le whilemieux serait remplacé par un for. Code suggéré:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire
D'accord, je l'ai maintenant. Merci.
Vatsal Chavda
Eh bien, idéalement, vous devriez éditer votre code pour inclure ces commentaires (c'est-à-dire ... si vous pensez qu'ils sont bons pour votre réponse!). Je ne vais pas envisager de supprimer mon downvote tant que le code reste inchangé.
Olivier Grégoire
Je suis nouveau ici, donc je ne sais pas encore comment les choses fonctionnent ici. Cependant, appréciez votre aide.
Vatsal Chavda
Ceci est vraiment mieux! J'ai édité juste un peu, mais vous venez de découvrir comment cela fonctionne: apporter des réponses, les améliorer, récupérer les lauriers;)
Olivier Grégoire
5
En Java 11, nous pouvons utiliser la Collection.toArray(generator)méthode. Le code suivant créera un nouveau tableau de chaînes:
List<String> list =List.of("one","two","three");String[] array = list.toArray(String[]::new)
List<String> list =newArrayList<>();
list.add("a");
list.add("b");
list.add("c");String[] strArry= list.stream().toArray(size ->newString[size]);
Par commentaires, j'ai ajouté un paragraphe pour expliquer comment fonctionne la conversion. Tout d'abord, List est converti en un flux String. Ensuite, il utilise Stream.toArray pour convertir les éléments du flux en tableau. Dans la dernière instruction ci-dessus, "size -> new String [size]" est en fait une fonction IntFunction qui alloue un tableau String avec la taille du flux String. La déclaration est identique à
toArray(T[])
et similaire en syntaxeStream.toArray
.Réponses:
Par exemple:
La
toArray()
méthode sans passer aucun argument renvoieObject[]
. Vous devez donc passer un tableau comme argument, qui sera rempli avec les données de la liste et renvoyé. Vous pouvez également passer un tableau vide, mais vous pouvez également passer un tableau avec la taille souhaitée.Mise à jour importante : à l'origine le code ci-dessus utilisé
new String[list.size()]
. Cependant, ce blog révèle qu'en raison des optimisations JVM, l'utilisationnew String[0]
est meilleure maintenant.la source
Class
objet réel , ce qui semble être complètement impossible à dériver du type générique. Comme je l'ai dit, la raison en est que toute la construction est fausse; tout est simplement stocké sous forme d'objet en interne.Une alternative en Java 8:
Java 11+:
la source
toArray
sur unStream
objet. Cette erreur de compilation peut se produire si vous réduisez le flux à l'aide de aCollectors
puis essayez d'appliquertoArray
.Vous pouvez utiliser la
toArray()
méthode pourList
:Ou vous pouvez ajouter manuellement les éléments à un tableau:
J'espère que cela t'aides!
la source
En utilisant copyOf, ArrayList aux tableaux peut également être fait.
la source
À partir de Java-11, on peut également utiliser l'API
Collection.toArray(IntFunction<T[]> generator)
pour obtenir la même chose que:la source
En Java 8:
la source
parallelStream()
au lieu de simplementstream()
?En Java 8, cela peut être fait en utilisant
la source
Génériques solution secrète tout
List<Type>
àString []
:Remarque Vous devez
override toString()
méthode.la source
la source
dans le cas où une manipulation supplémentaire des données est souhaitée, pour laquelle l'utilisateur souhaite une fonction, cette approche n'est pas parfaite (car elle nécessite de passer la classe de l'élément comme deuxième paramètre), mais fonctionne:
import java.util.ArrayList; import java.lang.reflect.Array;
la source
Si votre application utilise déjà la bibliothèque Apache Commons, vous pouvez légèrement modifier la réponse acceptée pour ne pas créer un nouveau tableau vide à chaque fois:
Il existe quelques autres tableaux vides préalloués de différents types dans
ArrayUtils
.Nous pouvons aussi tromper JVM pour créer un tableau vide pour nous de cette façon:
Mais il n'y a vraiment aucun avantage de cette façon, juste une question de goût, OMI.
la source
Vous pouvez utiliser
Iterator<String>
pour itérer les éléments deArrayList<String>
:Vous pouvez désormais retirer des éléments de
String[]
toute boucle.la source
.toString()
là où aucun transtypage explicite ne serait nécessaire, 3. vous n'incrémentez même pasi
, et 4. lewhile
mieux serait remplacé par unfor
. Code suggéré:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
En Java 11, nous pouvons utiliser la
Collection.toArray(generator)
méthode. Le code suivant créera un nouveau tableau de chaînes:de java.base
java.util.Collection.toArray()
.la source
Par commentaires, j'ai ajouté un paragraphe pour expliquer comment fonctionne la conversion. Tout d'abord, List est converti en un flux String. Ensuite, il utilise Stream.toArray pour convertir les éléments du flux en tableau. Dans la dernière instruction ci-dessus, "size -> new String [size]" est en fait une fonction IntFunction qui alloue un tableau String avec la taille du flux String. La déclaration est identique à
la source
Vous pouvez convertir List en tableau String en utilisant cette méthode:
L'exemple complet:
la source
la source