J'ai une collection c1<MyClass>
et un tableau a<MyClass>
. J'essaye de convertir le tableau en collection c2
et fais c1.removeAll(c2)
, mais cela jette UnsupportedOperationException
. J'ai trouvé que le asList()
des rendements de classe Arrays Arrays.ArrayList
classe et la cette classe hérite removeAll()
de AbstractList()
dont la mise en œuvre jette UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
Existe-t-il un moyen de supprimer les éléments? s'il vous plaît aider
Réponses:
Arrays.asList
renvoie unList
wrapper autour d'un tableau. Ce wrapper a une taille fixe et est directement sauvegardé par le tableau, et en tant que tel, les appels àset
modifieront le tableau, et toute autre méthode qui modifie la liste lèvera unUnsupportedOperationException
.Pour résoudre ce problème, vous devez créer une nouvelle liste modifiable en copiant le contenu de la liste wrapper. C'est facile à faire en utilisant le
ArrayList
constructeur qui prend unCollection
:la source
java.util.Arrays
asList()
méthode, et il semble renvoyer un fichierArrayList
. Cependant, quand je fais unSystem.out.println(list.getClass());
, je reçoisclass java.util.Arrays$ArrayList
. Il utilise donc laArrayList
classe interne , qui n'a pas de méthodeadd
ouremove
. Je me demande simplement quel est l'intérêt d'avoir uneArrayList
classe interne au lieu d'utiliser celle-java.util.ArrayList
ci et pourquoi pas une méthodeadd()
andremove()
?add
etremove
java.util.ArrayList
. Vous voulez qu'une implémentation deList
cela lève une exception si vous faites quelque chose d'illégal avec elle (comme l'ajout ou la suppression), etArrayList
ne répond pas à cette exigence.Arrays.asList
crée simplement un wrapperList
. Mais c'est toujours unjava.util.List
, donc il doit avoir ces méthodes. Mais ils ne peuvent pas être appliqués car cela conduirait à créer un nouveau tableau de taille différente. Ce qui ne peut pas être fait car les modifications que vous pouvez encore effectuer peuvent être effectuées à la fois via la liste renvoyée et le tableau d'origine. Cela ne sera pas possible si la liste renvoyée pouvait changer de manière à éliminer la référence de tableau d'origine.Oui, la
Arrays.asList(..)
collection est qui ne peut pas être étendue 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 un
new ArrayList(Arrays.asList(..)
ou supprimez des éléments directement du tableau (ce sera moins efficace et plus difficile à écrire)la source
C'est ainsi que cela
Array.asList()
fonctionne, car il est directement soutenu par la baie. Pour obtenir une liste entièrement modifiable, vous devez cloner la collection dans une collection créée par vous-même.la source
ArrayList
. La différence n'était peut-être pas trop claire cependant. :-) Que la liste soit modifiable ou non est une question de définition, elle est "semi-modifiable" mais pas totalement modifiable à mon avis.