2012-03-26 34 views
10

Me pregunto por qué diseñaron el método toArray en ArrayList para tomar una entrada de una matriz en Java?Método ArrayList.toArray() 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); 

A mí me parece que, ellos no necesitan esta entrada porque la instancia de la propia ArrayList tiene suficientes detalles para convertir los datos en una matriz.

Mi pregunta es ¿por qué todavía necesitan que se transfiera la matriz? Gracias.

Respuesta

13

dos razones que se me ocurren:

  1. Erasure significa que los parámetros genéricos no están disponibles en tiempo de ejecución, por lo que un ArrayList<String> no saben que contiene cadenas, es sólo la materia prima de tipo ArrayList. Por lo tanto todas las invocaciones de toArray() tendrían que devolver un Object[], que no es estrictamente correcto. Habría que crear realmente una segunda serie de String[] continuación, iterar sobre el primero, emitido todos sus parámetros a su vez de salir con el tipo de resultado deseado.
  2. La forma en que se define el método significa que puede pasar una referencia a una matriz existente y llenarla mediante el método. En algunos casos, esto es muy conveniente, en lugar de tener una nueva matriz devuelta y luego copiar sus valores en otro lugar.
+0

Gracias, lo entendí. En mi ejemplo, ¿debería asumir "strArray" o "a" como resultado final? ¿Son ellos mismos? –

+4

Son lo mismo, _if_ 'collection.size() <= strArray.size()', que es verdadero en su caso específico. En general, es una buena práctica usar 'a' de todos modos. –

+0

@LouisWasserman Gracias. –

0

Es así que cuando tiene un conjunto no vacío al que desea agregar un objeto desde la conversión del arraylist, puede hacerlo sin tener que crear un nuevo conjunto, y luego procesarlo para fusionarlo, guardar recursos y trabajo extra.

Lea el segundo párrafo de la javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (T [])

1

Lo necesita para obtener tipos de matriz que no sean Object[]. listArray.toArray(new String[3]) no debería necesitar un molde para String[], pero le permite escribir en matrices para tipos específicos, en lugar del enfoque (inseguro) de simplemente convertir Object[] a cualquiera que sea su tipo.

0

No es obligatorio pasar matriz como un argumento a toArray(), puede llamar directamente arrayList.toArray()

Como sabemos que Marco de la colección con los genéricos trabaja con el concepto de Tipo Erasure. Entonces el arrayList se convierte en una lista de Object, de modo que cuando convierta a array dará un objeto [] si no pasa ningún argumento.

0

ArrayList no tiene suficiente información ya que los "datos" en sí se almacenan en intervalos de matrices Object. Por lo tanto, si sabe "qué" tipo de elementos tiene en su lista de matriz, puede lograr la seguridad de tipo utilizando esta variante del método toArray.

2

En su código, el ArrayList puede contener cualquier cosa, no sólo las cadenas. Se podría volver a escribir el código para:

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); 

Sin embargo, en las matrices Java contienen sus tipos de contenido (String) en tiempo de ejecución, mientras que los genéricos son borrados por el compilador, por lo que todavía hay forma de que el sistema de ejecución para saber que debería crear un String[] en su código.