Supondo que arraylist
seja definido como ArrayList<String> arraylist
, é arraylist.removeAll(arraylist)
equivalente a arraylist.clear()
?
Em caso afirmativo, posso assumir que o clear()
método é mais eficiente para esvaziar a lista de matrizes?
Existem advertências no uso em arraylist.removeAll(arraylist)
vez de arraylist.clear()
?
arraylist.removeAll(arraylist)
? Não vejo absolutamente nenhuma razão para fazer isso.elementData[i] = null
ee.remove()
significativo?arrList.removeAll(arrList)
vez dearrList.clear()
.arrList1.removeAll(arrList2)
é uma questão diferente.if (c == this && !isEmpty()) { clear(); return true; }
. Vou ter que enviar isso para o OpenJDK como um patch! ;-)Respostas:
O código fonte para
clear()
:O código-fonte para
removeAll()
(conforme definido emAbstractCollection
):clear()
é muito mais rápido, pois não precisa lidar com todas essas chamadas de método extras.E, como aponta Atrey,
c.contains(..)
aumenta a complexidade do temporemoveAll
para O (n 2 ) em oposição aoclear
O (n).fonte
c.contains(...)
compara a complexidade de tempo da operação tornaria essa resposta completa.AbstractList.Itr.remove()
eArrayList.remove(int)
), tambémsize = 0; elementData = new Object[10];
todo o resto seria coletado como lixo, pois a matriz de backup não tem referências externas.A complexidade temporal de
ArrayList.clear()
éO(n)
e deremoveAll
éO(n^2)
.Então, sim,
ArrayList.clear
é muito mais rápido.fonte
O
clear()
método remove todos os elementos de um únicoArrayList
. É uma operação rápida, pois apenas define os elementos da matriznull
.O
removeAll(Collection)
método, que é herdadoAbstractCollection
, remove todos os elementos que estão na coleção de argumentos da coleção em que você chama o método. É uma operação relativamente lenta, pois precisa pesquisar em uma das coleções envolvidas.fonte
A menos que haja uma otimização específica que verifique se o argumento passado
removeAll()
é a própria coleção (e duvido muito que essa otimização esteja lá), será significativamente mais lento que um simples.clear()
.Além disso (e pelo menos igualmente importante):
arraylist.removeAll(arraylist)
é apenas um código obtuso e confuso. É uma maneira muito atrasada de dizer "limpe esta coleção". Que vantagem teria sobre o muito compreensívelarraylist.clear()
?fonte
Eles servem a propósitos diferentes.
clear()
limpa uma instância da classe,removeAll()
remove todos os objetos fornecidos e retorna o estado da operação.fonte
clear()
percorrerá a matriz subjacente e definirá cada entrada como nula;removeAll(collection)
passará pelo ArrayList verificando a coleção eremove(Object)
, se existir.Eu imagino que
clear()
é muito mais rápido do que removeAll, porque não está comparando, etc.fonte
A limpeza é mais rápida porque não faz loop sobre os elementos a serem excluídos. Este método pode assumir que TODOS os elementos podem ser excluídos.
Remove all
não significa necessariamente excluir todos os elementos da lista, apenas aqueles fornecidos como parâmetros DEVEM ser excluídos. Portanto, é necessário mais esforço para manter aqueles que não devem ser excluídos.ESCLARECIMENTO
Por 'loop', quero dizer que não é necessário verificar se o elemento deve ser mantido ou não. Pode definir a referência
null
sem pesquisar nas listas de elementos fornecidas a serem excluídas.Clear
É mais rápido quedeleteall
.fonte
ArrayList.clear()
também deve se repetir.target.removeAll(param)
iteraráparam
e depois chamará otarget.contains(...)
que iteratarget
.clear () será muito mais eficiente. Simplesmente removerá todos os itens. O uso de removeAll (arraylist) exigirá muito mais trabalho, pois verificará todos os itens do arraylist para ver se ele existe no arraylist antes de removê-lo.
fonte
Matriz => depois que o espaço é alocado para uma variável Matriz no tempo de execução, o espaço alocado não pode ser estendido ou removido.
ArrayList => Este não é o caso no arraylist. ArrayList pode aumentar e diminuir no tempo de execução. O espaço alocado pode ser minimizado ou maximizado no tempo de execução.
fonte