[quote=jaozi_nho]Olá pessoal, estou fazendo um programa que usa muitas iterações em Lista (Adiciona, remover e alterar elementos), e esta ficando bem lento.
Estou usando ArrayList e JDK 1.7 e ListIterator, existe algo melhor para usar e ter maior performance com Lista em java?
alguns exemplo do codigo a seguir:
public void adiciona_modificacoes(ArrayList<Modificacao> novas_modificacoes)
{
Modificacao aux;
ListIterator<Modificacao> i = novas_modificacoes.listIterator();
while(i.hasNext())
{
aux = i.next();
if(aux.classee.equals(this.nome))
{
this.modificacoes.add(aux);
i.remove();
}
}
}
[/quote]
Engraçado que alguém pergunta se tem algo mais rápido que arraylist e não faltam sugestões :lol:
Mais em rápido em quê ?
É muito rápido iterar um ArrayList, e mudar para Set não muda em nada isso. O Set não é nem mais rápido nem mais lento porque faz coisas diferentes!
Mas vc está removendo da lista. Ai que está o problema remover de um ArrayList é o pior cenário possivel.
O seu design é fraco e complexo. Vamos mudar algumas coisas assim :
[code]public void adiciona_modificacoes(List novas_modificacoes) // parametros devem ser interfaces
{
for (Iterator<Modificacao> it = novas_modificacoes.iterator(); it.hasNext(); ){ // basta usar iterator, e não ListIterator
Modificacao aux = it.next();
if(aux.classee.equals(this.nome))
{
this.modificacoes.add(aux); // aqui ha uma adição em outra coleção.
it.remove(); // aqui ha a remoção do item
}
}
}[/code]
bom, agora é claro que este código terá performance diferente comforme a lista passada.
Sempre que ha um remove, o arrayList é obrigado a criar um novo array e copiar o anterior excepto o elemento apagado. Isto é lento.
A implementação mais rápida para isso é LinkedList. Então, seria bom ter a certeza que se passa um LinkeList. Mas como é uma parametro, isso significa que ha que fazer alterações em algum outro lugar do sistema.
Veja que mesmo usando LinkedList o tempo de execução ainda está ligado a quantos itens existem na lista. Isso também afeta o resultado. MAs para o mesmo numero , grande de itens, o LinekdList é mais rápido na remoção.
O resumo da opera é o seguinte:
A Iteração em si é igualmente rápida no ArrayList ou no LinkedList. A Adição e Remoção aleatória ( no meio da lista) é sempra mais rápida no LinkedList ( é para isso que ele foi inventado). A inserção simples, sequencial (sempre no fim) é mais rápida no ArrayList se , e somente se, o tamanho máximo da lista é conhecidoà priori e passado no construtor, caso contrário a inserção simples e sequencial é mais rápida no LinkedList.
Mudar para Set não afeta o resultado. A única operação mais rápida no Set que no resto é o contains.
Uma nota sobre o for vs while : o resultado é o mesmo, mas o for é especialmente criado para iterações. Ele poupa memória porque o iterador é descartado ao sair do for, assim como a variável auxiliar. Usando while, estas variáveis ficam presentes até sair do método. Além disso, usar while obriga a escrever mais e torna o código menos legeivel. A falta de legibilidade, por sua vez, esconde problemas que seriam obvios se houvesse menos codigo para ler.