Executando verificação de segurança...
0

Por que listas grandes são ruins (Java)?

⚠️ O problema das listas

Quando estamos começando os estudos de programação, uma das primeiras estruturas de dados organizada que aprendemos são as listas,que permitem criar um espaço na memória pra armazenar na memória um conjunto de objetos

Desde então, passamos a usar listas em qualquer lugar do código onde faça sentido. No entanto, listas têm um problema muito grande: Elas são péssimas para pesquisas.

No código exemplo Cronometramos o tempo que leva pra um programa em java buscar 30.000 elementos em uma lista e verificar se eles existem:

import java.util.*;

class Teste {

    public static void main(String[] args) {

       System.out.println("\n\nStarting... \n");

        Collection<Integer> lista = new ArrayList<>();

        int qtde = 300000;

        for(int i = 0; i <= qtde; i++) {

                lista.add(i);
        }
        
        long inicio = System.currentTimeMillis();

        for(int i = 0; i <= qtde; i++) {

                lista.contains(i);
        }

        long fim = System.currentTimeMillis();
        long tempo = fim - inicio;

        System.out.println("\nTempo de excecucao: " + tempo + " ms");
     }
 }

Geralmente o programa levará um tempo relativamente grande para percorrer todas as posições

No entanto, modificando a declaração da lista:

Collection<Integer> lista = new HashSet<>();

Percebemos um ganho absurdo na parte de buscar um objeto rapidamente.

E o pior: mude de 30,000 para 300,000. Veremos que o programa simplesmente para no tempo. Rodando um tempao sem retornar nada. Portanto, quando o assunto é armazenar objetos para buscá-los novamente de forma eficiente, evite usar listas.

Carregando publicação patrocinada...
1

armazenar objetos para buscá-los novamente de forma eficiente, evite usar listas

De forma geral, sim. Mas eu diria que depende.

Se a quantidade de elementos é pequena, e se forem feitas poucas buscas, tanto faz. Para poucos dados, tudo é rápido. Lembre-se que um Set possui um custo adicional, já que mantém internamente uma estrutura de dados específica para que as buscas sejam mais eficientes (no caso do HashSet, a documentação diz que internamente ele usa um HashMap). Se são poucos dados e poucas buscas, talvez nem compense - ou não faça diferença - usar Set ou List.

Por exemplo, se a lista estiver ordenada (como já disseram em outro comentário), uma busca binária é muito eficiente (mesmo se tiver 2 bilhões de elementos, no pior caso precisa de uns 30 passos para encontrar qualquer elemento).

Claro que um Set é uma excelente opção para uma grande quantidade de elementos e/ou se tiver muitas buscas a serem feitas (e se precisar de elementos ordenados, ainda tem a opção de usar TreeSet ou LinkedHashSet - o primeiro usa a ordem natural dos elementos, o segundo usa a ordem em que eles foram inseridos). Um detalhe é que um Set não permite elementos duplicados - então se você precisa manter elementos repetidos, aí não tem como escapar de usar uma lista.

Enfim, a grande lição é que toda e qualquer estrutura de dados possui características específicas, vantagens e desvantagens, e o mais importante é entender cada uma delas, e avaliar caso a caso qual a mais apropriada para cada situação (preciso de ordem específica? tem mais inserções, remoções, buscas? etc). No fim vale a famosa frase de Linus Torvalds:

"Bad programmers worry about the code. Good programmers worry about data structures and their relationships."

"Programadores ruins se preocupam com o código. Programadores bons se preocupam com estruturas de dados e seus relacionamentos."


Por fim, vale lembrar que usar System.currentTimeMillis() é uma forma simples de medir o tempo, porém muito sujeita a falhas. Existem formas mais assertivas de fazer esta medição - eu costumo usar o JMH - Java Microbenchmark Harness, mas existem várias outras libs para isso.

1

Cara que comentário massa, amigo. Com certeza vou tirar muitos tópicos de estudo e aporfundamento daqui. Obrigado sempre pelas correções, a cada dia procuro avançar um pouquinho nessa jornada maravilhosa no mundo da programação

Valeu mn😄

0

Eu não vejo problema em usar listas desde que você use um algoritmo eficiente para percorre-la.

Para listas ordenadas, você pode usar a busca binária, busca em salto e busca interpolada.

E para listas não ordenadas, a busca em largura e a busca em profundidade. Essas duas ultimas são usadas para percorrer árvores e grafos, então meio que não importa se estão ordenadas ou não.

1
1

Mas só uma dúvida mn. Nesse algoritmo ai a intenção é passar por todas as posições da lista. Esses algoritmos de busca seriam mais eficientes pra passar por todas as posições se necessário?

1