Remover o primeiro elemento de uma lista

Remover o primeiro elemento de uma lista

1. Visão geral

Neste tutorial super rápido, mostraremos como remover o primeiro elemento de umList.

Vamos realizar esta operação para duas implementações comuns da interfaceList -ArrayListeLinkedList.

2. Criando umList

Em primeiro lugar, vamos preencher nossoLists:

@Before
public void init() {
    list.add("cat");
    list.add("dog");
    list.add("pig");
    list.add("cow");
    list.add("goat");

    linkedList.add("cat");
    linkedList.add("dog");
    linkedList.add("pig");
    linkedList.add("cow");
    linkedList.add("goat");
}

3. ArrayList

Em segundo lugar, vamos remover o primeiro elemento deArrayList,e garantir que nossa lista não o contenha mais:

@Test
public void givenList_whenRemoveFirst_thenRemoved() {
    list.remove(0);

    assertThat(list, hasSize(4));
    assertThat(list, not(contains("cat")));
}

Conforme mostrado acima, estamos usando o métodoremove(index) para remover o primeiro elemento -this will also work for any implementation of the List interface.

4. LinkedList

LinkedList também implementa o métodoremove(index) (à sua maneira), mas também tem o métodoremoveFirst().

Vamos nos certificar de que funcione conforme o esperado:

@Test
public void givenLinkedList_whenRemoveFirst_thenRemoved() {
    linkedList.removeFirst();

    assertThat(linkedList, hasSize(4));
    assertThat(linkedList, not(contains("cat")));
}

5. Complexidade temporal

Embora os métodos pareçam semelhantes, sua eficiência é diferente. O método deArrayListremove() requer tempo O (n), enquanto o método deLinkedListremoveFirst() requer tempo O (1).

Isso ocorre porqueArrayList usa uma matriz subjacente e a operaçãoremove() requer a cópia do resto da matriz para o início. Quanto maior a matriz, mais elementos precisam ser alterados.

Ao contrário disso,LinkedList usa ponteiros, o que significa que cada elemento aponta para o próximo e para o anterior.

Portanto, remover o primeiro elemento significa apenas mudar o ponteiro para o primeiro elemento. Essa operação sempre exige o mesmo tempo, não dependendo do tamanho de uma lista.

6. Conclusão

Neste artigo, cobrimos como remover o primeiro elemento de umList,e comparamos a eficiência dessa operação para simplificações deArrayListeLinkedList .

Como de costume, o código-fonte completo está disponívelover on GitHub.