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.

10
demandé sur java_mouse 2012-03-26 18:33:29

7 réponses

Deux raisons je pense:

  1. 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 type ArrayList. Ainsi toutes les invocations de toArray() devrait retourner un Object[], ce qui n'est pas strictement exact. Vous devez créer un second tableau de String[] 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.
  2. 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.
13
répondu Andrzej Doyle 2012-03-26 14:37:26

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.

2
répondu Mathias Schwarz 2012-03-26 14:39:26

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.

1
répondu Louis Wasserman 2012-03-26 14:37:52

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 [])

0
répondu Churk 2012-03-26 14:36:05

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.

0
répondu Sanjay T. Sharma 2012-03-26 14:38:23

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.

0
répondu Chandra Sekhar 2012-03-26 14:43:16

parce que le tableau dans lequel les éléments doivent être copiés doit être spécifié à la JVM.

Voir cette documentation

-1
répondu Ashok Raj 2012-03-26 14:38:33