2009-10-26 16 views

Respuesta

53

Array.asList()envolturas una matriz en la interfaz de la lista. La lista todavía está respaldada por la matriz. Las matrices tienen un tamaño fijo: no admiten la adición o eliminación de elementos, por lo que el envoltorio no puede.

Los documentos no hacen esta tan claro como lo harían, pero hacen dicen:

Devuelve una lista de tamaño fijo el respaldo de la matriz especificada.

El "tamaño fijo" bit debe ser un indicio de que no se puede agregar o quitar elementos :)

Aunque hay otras maneras de evitar esto (otras maneras de crear un nuevo ArrayList de una matriz) sin bibliotecas extra, yo personalmente recomendaría conseguir el Google Collections Library (o Guava, cuando se libera). A continuación, puede utilizar:

List<Integer> list = Lists.newArrayList(array); 

La razón por la que estoy sugiriendo es que el GCL es una cosa buena en general, y bien vale la pena utilizar.

Como se señala en los comentarios, esto toma una copia de la matriz; la lista no está respaldada por la matriz original, y los cambios en cualquiera de las colecciones no se verán en la otra.

+1

+1 para Google Guava – Snekse

+0

De acuerdo. Sin embargo, creo que vale la pena señalar que el método original devuelve una lista que está respaldada por la matriz original y cambia el "escrito a través" de la matriz original. Usar esto no devolverá una Lista respaldada por la matriz original, y cualquier cambio en esta Lista devuelta NO afectará a la matriz original. – desau

+0

@desau: he editado para indicar eso. –

5

la implementación que recibe de asList no implementa una interfaz de lista completa. Transformaría la lista en ArrayList y luego haría modificaciones en ella.

Ver http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29

+0

¿Quiere decir iteración en esta lista y poner todos los objetos de una ArrayList al principio? –

+0

no, el constructor ArrayList toma una Colección como argumento, por lo que puede simplemente llamar a ArrayList nueva. –

17

No es java.util.ArrayList. Arrays.asList() devuelve su propia implementación List y no admite la eliminación. Puede crear una verdadera ArrayList de ella:

new java.util.ArrayList(Arrays.asList(someArray)); 

Es muy confuso cómo asList() obras, debo admitir.

0

Porque obtiene la lista de solo lectura. tratar

List newList = new ArrayList(myList); 
+4

No es de solo lectura, solo es de tamaño fijo. –

6

Lea los documentos de la API para Arrays.asList():

Devuelve una lista de tamaño fijo el respaldo de la matriz especificada. (Los cambios en la lista devuelta "escriben a través" de la matriz.)

Tenga en cuenta que Collections.remove (int) está marcado en el Javadocs como una "operación opcional", es decir, no todas las Colecciones apoyarán. "lista de tamaño fijo" significa que no puede cambiar el tamaño de la lista, lo que eliminaría() haría. Entonces no es compatible.

Si desea cambiar la lista generada por Arrays.asList(), simplemente cópiela, p. new ArrayList(Arrays.asList(...)).

0

uso

ArrayList en lugar de Lista

Lista ha fijado elemento de tamaño, la lista puede ni elemento Además, ni remover el artículo

Cuestiones relacionadas