Liste de tableaux.méthode toArray () en Java
je me demande pourquoi ils ont conçu le toArray
méthode ArrayList
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 que, ils n'ont pas besoin de cette entrée parce que l'instance de L'ArrayList lui-même a assez de détails pour convertir les données en tableau.
ma question est pourquoi ont-ils encore besoin du tableau pour passer? Grâce.
7 réponses
Deux raisons je pense:
- Erasure signifie que les paramètres génériques ne sont pas disponibles à l'exécution, donc un
ArrayList<String>
ne pas qu'il contient des chaînes, c'est seulement la première de typeArrayList
. Ainsi toutes les invocations detoArray()
devrait retourner unObject[]
, ce qui n'est pas strictement exact. Vous devez créer un second tableau deString[]
puis itérer sur la première, en jetant tous ses paramètres tour à tour pour en sortir avec le résultat désiré type. - la façon dont la méthode est définie signifie que vous pouvez passer dans une référence à un tableau existant, et avoir ceci peuplé via la méthode. Dans certains cas, c'est probablement très pratique, plutôt que d'avoir un nouveau tableau retourné et la copie de ses valeurs ailleurs.
Dans votre code, le ArrayList
peut contenir n'importe quoi, pas seulement des chaînes. Vous pouvez réécrire le code:
ArrayList<String> listArray = new ArrayList<String>();
listArray.add("Germany");
listArray.add("Holland");
listArray.add("Sweden");
String []strArray = new String[3];
String[] a = listArray.toArray(strArray);
Cependant, en Java les tableaux contiennent leur type de contenu (chaîne) à l'exécution, tandis que les génériques sont effacés par le compilateur, donc il n'y a toujours aucun moyen pour le système d'exécution de savoir qu'il devrait créer un String[]
dans votre code.
vous en avez besoin pour obtenir des types de tableaux autres que Object[]
. listArray.toArray(new String[3])
ne devrait pas réellement besoin d'un plâtre pour String[]
, mais il vous permet d'écrire dans des tableaux pour des types spécifiques, plutôt que l'approche (plutôt dangereuse) de juste casting Object[]
à quelque soit votre type.
c'est ainsi que lorsque vous avez un tableau non vide, vous voulez que l'objet soit ajouté à partir de la conversion arraylist, vous pouvez le faire sans avoir à créer un nouveau tableau, et faire le traitement de post de sa fusion, sauver la ressource et le travail supplémentaire.
lire le deuxième paragraphe du javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray(T [])
ArrayList
ne dispose pas de suffisamment d'informations étant donné que les" données " elles-mêmes sont stockées dans des seaux de Object
tableaux. Ainsi, si vous savez "quel" type d'articles vous avez dans votre liste de tableau, vous pouvez atteindre la sécurité de type en utilisant cette variante de la toArray
méthode.
Il n'est pas obligatoire de passer Tableau comme argument à toArray(), vous pouvez directement appeler arrayList.toArray ()
Comme nous le savons cadre de Collecte avec les génériques fonctionne avec le concept de Type Erasure. Ainsi l'arrayList devient liste D'objet, donc quand vous convertissez en tableau il donnera un Object [] si vous ne passez aucun argument.
parce que le tableau dans lequel les éléments doivent être copiés doit être spécifié à la JVM.