ArrayList.toArray () en Java
Je me demande pourquoi ont-ils la conception de la toArray
méthode dans ArrayList
de prendre une entrée d'un tableau en Java?
ArrayList<String> listArray = new ArrayList<String>();
listArray.add("Germany");
listArray.add("Holland");
listArray.add("Sweden");
String []strArray = new String[3];
String[] a = (String [])listArray.toArray(strArray);
Pour moi, il semble qu'ils n'ont pas besoin de cette entrée parce que l'instance de la liste de tableaux a lui-même assez de détails pour convertir les données dans un tableau.
Ma question est: pourquoi ont-ils encore besoin de la matrice passée en? Merci.
source d'informationauteur java_mouse
Vous devez vous connecter pour publier un commentaire.
Deux raisons je pense:
ArrayList<String>
n'est pas savoir qu'il contient des chaînes, c'est seulement la première de typeArrayList
. Ainsi, toutes les invocations detoArray()
aurait à retourner unObject[]
ce qui n'est pas strictement exact. Vous auriez à réellement créer un second tableau deString[]
puis itérer sur le premier, en les jetant tous ses paramètres à leur tour de sortir avec le type de résultat souhaité.Dans votre code, le
ArrayList
peuvent contenir n'importe quoi, pas seulement des Chaînes de caractères. Vous pouvez réécrire le code pour:Cependant, en Java, les tableaux contiennent leur type de contenu (String) au moment de l'exécution, tandis que les génériques sont effacées par le compilateur, donc il n'y a encore aucun moyen pour le système d'exécution de savoir qu'il doit créer une
String[]
dans votre code.Vous en avez besoin pour obtenir la matrice de types autres que
Object[]
.listArray.toArray(new String[3])
ne devrait pas réellement besoin d'un plâtre pourString[]
mais il permet d'écrire dans des tableaux pour des types spécifiques, plutôt que de la (plutôt dangereux) approche de simplement jeter leObject[]
à ce que votre type est.C'est ainsi que lorsque vous avez un tableau vide, vous souhaitez que l'objet soit ajouté à partir de la liste de tableaux de conversion, vous pouvez le faire sans avoir à créer un nouveau tableau, et faire du post-traitement de fusion, d'économiser des ressources et de travail supplémentaire.
Lire le deuxième paragraphe de la javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray(T%5B%5D)
ArrayList
ne pas avoir assez d'informations étant donné que les "données" lui-même est stocké dans des seaux deObject
tableaux. Donc, si vous savez "ce" genre d'articles que vous avez dans votre liste de tableau, vous pouvez obtenir le type de sécurité à l'aide de cette variante de latoArray
méthode.Il n'est pas obligatoire de passer Tableau comme argument à toArray(), vous pouvez appeler directement arrayList.toArray()
Que nous savons que cadre de Collecte avec les génériques fonctionne avec le concept de Type d'Effacement. Si la liste de tableaux devient liste d'Objet, de sorte que lors de la conversion en tableau, il va donner une Object[] si vous n'avez pas passer n'importe quel argument.
Parce que le tableau dans lequel les éléments sont copiés doivent être spécifiées à la JVM.
Voir cette documentation