Tengo una colección c1<MyClass>y una matriz a<MyClass>. Estoy tratando de convertir la matriz en una colección c2y lo hago c1.removeAll(c2), pero esto arroja UnsupportedOperationException. Descubrí que la asList()clase of Arrays devuelve la Arrays.ArrayListclase y esta clase hereda la removeAll()de AbstractList()cuya implementación arroja UnsupportedOperationException.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
¿Hay alguna forma de eliminar los elementos? por favor ayuda

Respuestas:
Arrays.asListdevuelve unaListenvoltura alrededor de una matriz. Este contenedor tiene un tamaño fijo y está respaldado directamente por la matriz, y como tal, las llamadas asetmodificarán la matriz, y cualquier otro método que modifique la lista arrojará unUnsupportedOperationException.Para solucionar esto, debe crear una nueva lista modificable copiando el contenido de la lista contenedora. Esto es fácil de hacer usando el
ArrayListconstructor que toma unCollection:fuente
java.util.ArraysasList()método y parece devolver unArrayList. Sin embargo, cuando hago unSystem.out.println(list.getClass());, obtengoclass java.util.Arrays$ArrayList. Entonces usa laArrayListclase interna , que no tiene un métodoaddoremove. Me pregunto cuál es el punto de tener unaArrayListclase interna en lugar de usarjava.util.ArrayListuna y por qué no tener un métodoadd()yremove().addyremovejava.util.ArrayList. Desea una implementaciónListque arroje una excepción si hace algo ilegal con ella (como agregar o eliminar), yArrayListno cumple con ese requisito.Arrays.asListsolo crea un contenedorList. Pero sigue siendo unjava.util.List, por lo que debe tener esos métodos. Pero no se pueden aplicar porque eso llevaría a crear una nueva matriz con un tamaño diferente. Lo cual no se puede hacer porque las modificaciones que aún puede hacer se pueden realizar tanto a través de la Lista devuelta como de la matriz original. Esto no será posible si la Lista devuelta pudiera cambiar de modo que básicamente desechara la referencia de matriz original.Sí, la
Arrays.asList(..)colección es que no se puede expandir ni reducir (porque está respaldada por la matriz original y no se puede cambiar de tamaño).Si desea eliminar elementos, cree
new ArrayList(Arrays.asList(..)o elimine elementos directamente de la matriz (eso será menos eficiente y más difícil de escribir)fuente
Esa es la forma en que
Array.asList()funciona, porque está respaldado directamente por la matriz. Para obtener una lista completamente modificable, tendría que clonar la colección en una colección creada por usted mismo.fuente
ArrayList. Sin embargo, la diferencia quizás no fue demasiado clara. :-) Si la lista es modificable o no es una cuestión de definición, es "semi-modificable" pero no completamente modificable en mi opinión.