jorgefrancisco:
Olá pessoal, tranquilo?
Tenho que desenvolver uma aplicação que envolve grafos enormes, e para isso estou pensando em utilizar a representação de grafos em listas de adjacência juntamento com outras idéias para melhoria de desempenho.
Você só pode falar de eficiencia se soubre os requisitos do seus sistema. O fato de arraylist ser dinamico pode ser irrelevante se o seu modelo de grafo é estático (ou seja, é carregado uma vez e depois é só lido).
Vc precisa saber o equilibro entre escrita e leitua. E na leitura, se é indexada ou iterativa.
De posse destes dados vc faz a sua escolha.
- Não use arrays. Usar arrays é para quem sabe o questá fazendo. É como usar float. É preciso ter muito boas razões para usar arrays. Arrays não são polimorficos, logo estará violando a programação orientada a objetos e isso tem consequencias.
ArrayList implementa RandomAccess o que significa que é equivalente ao uso de array para operações get(i). LinkedList é mais lenta nestas operações, mas mais rápida em iteração. ArrayList só é ruim se vc adiconar itens durante a execução. Para um processo em que vc adiciona pouco e lê muito usando get(i) ArrayList é o ideal. Mas se vc adiciona mesmo muito pouco (tipo uma vez na inicialização) e itera a toda a hora considere usar a nova CopyOnWriteArrayList que é ainda mais eficiente.
Se vc faz mais interações do que get(i) não use ArrayList. Use LinkedList. LinkedList é mais rápida na edição e na iteração. Só perde quando usa get(i). Portanto, evite usar get(i) e use LinkedList.
Se vc não usa get(i) e só precisa de List porque precisa conter repetidos, use LinkedList. Se tem a certeza que não existem repetidos e get(i) é inutil use Set. Se os seus objetos são ordenáveis utilize TreeSet, caso contrario use HashSet ( lembre-se de impleemntar equals e hashCode corretamente). Se precisar manter a ordem se insersão use LinkedHashSet.
Set é melhor que list já que pode ser mais eficiente sem suportar get(i).
Portanto?
- preciso mesmo de suportar duplicados ?
Sim = List , não = Set
Se escolheu List :
2) Edito mais do que leio, ou leio mais do qu edito ?
Mais leitura = ArrayList (ou CopyOnWriteArraylist se tem mesmo quase nenhuma edição)
Mais edição = LinkedList
- Só itero ou uso get(i) ? ( não vale pensar em iterar usando get(i) para responder a isto)
Ou seja, o meu acesso é realmente aleatório ou sempre leio em uma certa ordem ?
Iteração (ordem) = LinkedList , get(i) ( aleatorio) = ArrayList
3.1) Se o acesso é aleatorio posso substituir por Map ?
Não = mantenha a lista escolhida.
Sim = Map e aplique o mesmo principio de Set ( os prefixo são os mesmos)
Se escolheu Set
4) Os objetos contidos são ordenáveis ( implementam Comparable ou existe um Comparator para eles) ?
Sim = TreeSet
Não = 4.1
4.1) A ordem que itero é realmente importante ou basta passar por todos os itens ?
Importante = LinkedSet , não = HashSet
Claro que exclui concorrencia desta escolha.