5
respostas

Tempo ArrayList vs LinkedList

...Onde uma ArrayList é lenta? ... inserir um novo elemento na primeira posição.. LinkedList possui uma grande vantagem aqui. Ela utiliza a estrutura de dados chamada lista ligada. Ela é muito rápida para adicionar e remover elementos na cabeça da lista...

Testei o código da aula e supostamente a linkedlist não deveria inserir mais rapido?

**** ArrayList vs LinkedList ***
Inserção na ArrayList demorou  40
Inserção na LinkedList demorou 165
Remoção da ArrayList demorou  39
Remoção da LinkedList demorou 0

Fiz alguma coisa de mal?

5 respostas

ArrayList é lenta na hora de você consultar. Cria um ArrayList de 1000 posições , insira e mostre o tempo e depois percorra até o final e mostre o tempo. Uma dica boa é usar o List<> , a inserção é parecida com o ArrayList e outros, mas sua consulta é muito mais rápida que o ArrayList.

Inserir na LinkedList não devia ser mais rapida do que no ArrayList? o valor não devia ser mais baixo?

Olá Sergio, sim o LinkedList é mais rápido para inserir ou remover no topo ou no final, você poderia compartilhar o código do teste?

Não necessariamente deve ser mais rápida, depende de como ela funciona internamente. Lembrando também que esse tempo pode variar um pouco de uma execução para outra.

Marcos rodei varias vezes e a diferença é semelhante, segundo o arraylist ele quando insere tem que arrastar todos os outros elementos uma posição, coisa que não acontece nas linkedlists, logo teoricamente as linked lists a inserir devem ser mais rapidas.

O código que usei foi o que o instrutor forneceu na aula.

public class TesteListas {

    public static void main(String[] args) {

        System.out.println("**** ArrayList vs LinkedList ***");

        List<Integer> numerosArrayList = new ArrayList<>();
        List<Integer> numerosLinkedList = new LinkedList<>();
        int quantidadeElementos = 1000000;

        long tempoArrayList  = insereElementosNo(numerosArrayList, quantidadeElementos);
        long tempoLinkedList = insereElementosNo(numerosLinkedList, quantidadeElementos);

        System.out.println("Inserção na ArrayList demorou  " + tempoArrayList);
        System.out.println("Inserção na LinkedList demorou " + tempoLinkedList);

        tempoArrayList = removePrimeirosElementos(numerosArrayList);
        tempoLinkedList = removePrimeirosElementos(numerosLinkedList);

        System.out.println("Remoção da ArrayList demorou  " + tempoArrayList);
        System.out.println("Remoção da LinkedList demorou " + tempoLinkedList);
    }

    /*
     * removendo 100 elementos sempre na primeira posição
     */
    private static long removePrimeirosElementos(List<Integer> numeros) {
        long ini = System.currentTimeMillis();

        for (int i = 0; i < 100; i++) {
            numeros.remove(0); //removendo sempre o primeiro elemento
        }
        long fim = System.currentTimeMillis();
        return fim-ini;
    }

    private static long insereElementosNo(List<Integer> numeros, int quantidade) {
        long ini = System.currentTimeMillis();
        for (int i = 0; i < quantidade; i++) {
            numeros.add(i);
        }
        long fim = System.currentTimeMillis();
        return fim-ini;
    }

}