List vs Collection vs Get

Olá pessoal,

Galera estou com um problema de desempenho na minha aplicação quando vou listar os dados do banco, eu estava usando o List e mudei para Collection pois o HashSet é muito mais rápido, porém um meu método mostrarItens não está mais pegando o get para fazer set na table model.

Alguém sabe o que pode ser? Pois se volto para List fica normal.

Vlw.

talvez se vc postasse uma parte do código…
:roll:

Oi,

Significa que a informação passada para possível retorno do método get não está adicionada em seu Hash.

Tchauzin!

Jingo,

Posta o seu código por favor…

Mas de antemão, acho que voce está com problemas na implementação de equals() e hashCode().

Voce implementou esses métodos através das chaves das suas entidades ?

Abs

Primeiro de tudo. De onde você tirou que o HashSet é mais rápido que o List?

O ArrayList é uma lista contínua, um vetorzão. É muito mais rápido percorre-lo que um HashSet. O HashSet só será vantajoso caso você queria eliminar rapidamente itens duplicados de sua coleção, e não permitir que itens duplicados sejam adicionados. Como o próprio nome já diz, e como meu xará ressaltou, o HashSet só funcionará se você tiver o método hashCode implementado corretamente e, para tanto, é também necessário implementar o método equals.

O método get() é lento apenas na LinkedList. Agora, se o objetivo é só percorrer a lista toda, é melhor em ambos os casos usar um for each, que utilizará o Iterator da coleção em questão.

Finalmente, se você tem um problema de performance, antes de sair trocando coisas no seu código, verifique se o problema é realmente lá. Uma ótima ferramenta para isso é o Visual VM: https://visualvm.dev.java.net/

Com ele, você pode medir quanto tempo cada operação do seu código leva, e otimizar no lugar certo. Essa ferramenta é chamada de profiler.

De onde eu tirei? Foi daqui http://blog.caelum.com.br/2006/10/04/performance-hashset-em-vez-de-arraylist/

Foi pesquisar mais sobre o hashCode e mudar os fors.

A aplicação não está lenta, só quando lista 50.000 registros, pois é preciso trazer informação de um ano atráz.

Agora fiquei confuso vocês disse que o HashSet não é melhor que o ArrayList só que a matéria acima diz o contrário, e agora?

Lento que eu falo são 2 segundos para trazer tudo.

É uma aplicação desktop, acredito que paginação seria o ideal, o que vocês acham?

Paginação é o ideal.

Complementando o comentário do meu xará…

Na verdade, eu nunca vi nenhuma literatura falando sobre HashSet ser mais rápido que uma implementação de List (Array ou LinkedList).

De qualquer forma, acho que o que está acontecendo:

1 - sua implementação de equals e hashCode está errada (por isso voce tem diferenças no get quando muda de Collection)

2 - o que acontece é que no seu banco devem existir campos que estão sendo ignorados pela interface Set, por isso que fica mais rápido …(isso tudo por conta do equals e hashcode errados)

Sim, ele fala que o método contains() do hashset é mais rápido. O artigo deixa bem claro que operações diferentes tem diferente performances, no caso, para percorrer uma lista, o arraylist é mesmo o mais rápido de todos.