2011-01-11 19 views
35

Recientemente descubrí que en realidad hay 2 implementaciones diferentes de ArrayList en Java (mejor tarde que nunca, supongo ...).¿Por qué Arrays.asList() devuelve su propia implementación ArrayList?

Entonces, me preguntaba ¿por qué el Arrays.asList(T... a) necesita devolver una lista que no puede redimensionarse? Si necesitaban una lista no modificable, ¿por qué agregar el método set(int index, E element)?

Así que mi pregunta general es ¿por qué no devolver el java.util.ArrayList desde el método Arrays.asList(T... a)?

¿Qué gana con la implementación java.util.Arrays.ArrayList?

Respuesta

40

Se preguntó:

también ¿Qué ganas con el java.util.Arrays.ArrayList aplicación?

Es porque los arrays $ ArrayList devuelto por Arrays.asList es sólo una visión de la matriz original. Entonces, cuando se cambia la matriz original, la vista también cambia.

Si se utiliza una ArrayList real, los elementos se copiarán y un cambio en la matriz de orignal no influirá en ArrayList.

Las razones para hacer esto son bastante simples:

  • rendimiento: no hay necesidad de copiar anyting
  • eficiente de memoria: no se necesita segunda matriz
+1

sólo la respuesta que estaba buscando, gracias! – Simeon

+1

Verdadero excepto por las razones. Los documentos significan solo escritura de datos para ser un puente entre matriz y bases de datos API – sblundy

+0

@sblundy y el significado del documento no solo la novia "Este método también proporciona una forma conveniente de crear un tamaño fijo ist inicializado para contener varios elementos" . Pero te doy un voto arriba. – Ralph

5

Son dos clases diferentes con comportamientos diferentes.

La lista que se devolvió al llamar a Arrays.asList es una envoltura delgada sobre la matriz, no una copia. La lista devuelta es de tamaño fijo: intentar llamar al add arrojará una excepción UnsupportedOperationException.

Por otro lado, el java.util.ArrayList conserva su propia copia interna de los datos y es de tamaño variable.

12

El javadoc dice que asList devuelve "una lista de tamaño fijo respaldada por la matriz especificada". Si desea redimensionar la matriz, debe crear una nueva y copiar los datos anteriores. Que la lista no estará respaldada por la misma instancia de matriz. El objetivo declarado es "Este método actúa como puente entre las API basadas en matrices y basadas en matrices". y por lo tanto, la escritura a través de la matriz subyacente es un requisito de diseño.

5

Arrays.asList necesita devolver una lista que no se puede redimensionar, porque la matriz subyacente no se puede redimensionar, pero eso es modificable, porque se permite la asignación a elementos en la matriz subyacente.

3

realidad lo puedes añadir elementos a ArrayList con agregar. método como este:

List<String> l2= new ArrayList<String>(Arrays.asList(array1)); 
l2.add("blueCheese"); 

En mi opinión lo utiliza para obtener las características de una lista, pero aplicándolos a una matriz.

+3

No, no puede agregar elementos a java.utils.Arrays.ArrayList devuelto por Arrays.asList (T ... a). Su fragmento de código construye una nueva java.util.ArrayList, que, como se muestra, admite #add. – dgtc

1

Dos observaciones:

1, en un intento para reducir el tamaño de la matriz devuelta al llamar al método remove() de la interfaz Lista lanzará una UnsupportedOperationException. Esto se debe a que la clase interna ArrayList dentro de la clase Arrays extiende AbstractList, y el método remove() en AbstractList arroja UnsupportedException.

Por lo tanto, una vez que se devuelve la Lista, puede sobreestimar elementos existentes, YA SEA en la matriz O en la Lista devuelta, PERO NO se le permite hacer crecer la matriz o reducir la matriz.

  1. En respuesta a:

    realidad lo puedes añadir elementos a la ArrayList con ADD. método de esta manera: Lista l2 = nueva ArrayList (Arrays.asList (array1)); l2.add ("blueCheese");

La l2 es una copia independiente de la lista, por lo que la Lista l2 ahora está desacoplada de la lista original &. Así que BlueCheese in en l2, pero no en la matriz/lista original que se respaldaron entre sí.

-dbednar

Cuestiones relacionadas