remove () sur la liste créée par Arrays.asList () lève une exception UnsupportedOperationException

J’ai une collection c1 et un tableau a . J’essaie de convertir le tableau en une collection c2 et faire c1.removeAll(c2) , mais cela génère une c1.removeAll(c2) . J’ai constaté que la asList() of Arrays renvoie la classe Arrays.ArrayList et la classe this hérite de removeAll() de AbstractList() dont l’implémentation génère une removeAll() .

  Myclass la[] = getMyClass(); Collection c = Arrays.asList(la); c.removeAll(thisAllreadyExistingMyClass); 

Est-il possible de supprimer les éléments? s’il vous plaît aider

Arrays.asList renvoie un wrapper List autour d’un tableau. Ce wrapper a une taille fixe et est directement soutenu par le tableau, et comme ces appels à set modifieront le tableau, toute autre méthode modifiant la liste lancera une UnsupportedOperationException .

Pour résoudre ce problème, vous devez créer une nouvelle liste modifiable en copiant le contenu de la liste de wrapper. Cela est facile à faire en utilisant le constructeur ArrayList qui prend une Collection :

 Collection c = new ArrayList(Arrays.asList(la)); 

Oui, Arrays.asList(..) est une collection qui ne peut pas être développée ou réduite (car elle est sauvegardée par le tableau d’origine et ne peut pas être redimensionnée).

Si vous souhaitez supprimer des éléments, créez une new ArrayList(Arrays.asList(..) ou supprimez des éléments directement du tableau (qui sera moins efficace et plus difficile à écrire)

C’est ainsi que fonctionne Array.asList() , car il est directement sauvegardé par le tableau. Pour obtenir une liste entièrement modifiable, vous devez cloner la collection dans une collection créée par vous-même.

 Collection c = new ArrayList(Arrays.asList(la))