Eu tenho uma coleção c1<MyClass>
e uma matriz a<MyClass>
. Estou tentando converter a matriz em uma coleção c2
e fazer c1.removeAll(c2)
, mas isso joga UnsupportedOperationException
. Descobri que a asList()
classe de Arrays retorna Arrays.ArrayList
classe e esta classe herda a removeAll()
de AbstractList()
cuja implementação é gerada UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
Existe alguma maneira de remover os elementos? por favor ajude
Respostas:
Arrays.asList
retorna umList
wrapper em torno de uma matriz. Este wrapper tem um tamanho fixo e é apoiado diretamente pelo array e, como tal, chamadas aset
modificarão o array e qualquer outro método que modifique a lista lançará umUnsupportedOperationException
.Para corrigir isso, você deve criar uma nova lista modificável copiando o conteúdo da lista de wrapper. Isso é fácil de fazer usando o
ArrayList
construtor que leva umCollection
:fonte
java.util.Arrays
asList()
método e parece retornar umArrayList
. No entanto, quando faço umSystem.out.println(list.getClass());
, receboclass java.util.Arrays$ArrayList
. Portanto, ele usa aArrayList
classe interna , que não tem um métodoadd
ouremove
. Só estou me perguntando qual é o sentido de ter umaArrayList
classe interna em vez de usarjava.util.ArrayList
uma e por que não ter um métodoadd()
eremove()
?add
eremove
java.util.ArrayList
. Você deseja que uma implementação deList
que lance uma exceção se fizer algo ilegal com ela (como adicionar ou remover) eArrayList
não atender a esse requisito.Arrays.asList
apenas cria um wrapperList
. Mas ainda é umjava.util.List
, então deve ter esses métodos. Mas eles não podem ser aplicados porque isso levaria à criação de uma nova matriz com tamanho diferente. O que não pode ser feito porque as modificações que você ainda pode fazer podem ser feitas por meio da lista retornada e da matriz original. Isso não será possível se a lista retornada puder ser alterada de forma que basicamente jogue fora a referência do array original.Sim,
Arrays.asList(..)
é uma coleção que não pode ser expandida ou reduzida (porque é apoiada pela matriz original e não pode ser redimensionada).Se você deseja remover elementos, crie um
new ArrayList(Arrays.asList(..)
ou remova elementos diretamente da matriz (isso será menos eficiente e mais difícil de escrever)fonte
É assim que
Array.asList()
funciona, porque é apoiado diretamente pelo array. Para obter uma lista totalmente modificável, você teria que clonar a coleção em uma coleção criada por você mesmo.fonte
ArrayList
. A diferença talvez não fosse muito clara. :-) Se a lista é modificável ou não é uma questão de definição, é "semimodificável" mas não totalmente modificável na minha opinião.