リストから最初の要素を削除する

リストから最初の要素を削除する

1. 概要

この超高速チュートリアルでは、Listから最初の要素を削除する方法を示します。

この操作は、Listインターフェースの2つの一般的な実装(ArrayListLinkedList)に対して実行します。

2. Listの作成

まず、Listsにデータを入力しましょう。

@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

次に、ArrayList,から最初の要素を削除し、リストにそれが含まれていないことを確認しましょう。

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

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

上に示したように、remove(index)メソッドを使用して最初の要素–this will also work for any implementation of the List interface.を削除しています

4. LinkedList

LinkedListは(独自の方法で)remove(index)メソッドも実装しますが、removeFirst()メソッドも実装します。

期待どおりに機能することを確認しましょう。

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

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

5. 時間の複雑さ

方法は似ていますが、効率は異なります。 ArrayListremove()メソッドにはO(n)時間が必要ですが、LinkedListremoveFirst()メソッドにはO(1)時間が必要です。

これは、ArrayListが内部で配列を使用し、remove()操作では、配列の残りの部分を先頭にコピーする必要があるためです。 配列が大きいほど、より多くの要素をシフトする必要があります。

それとは異なり、LinkedListはポインタを使用します。これは、各要素が次の要素と前の要素を指すことを意味します。

したがって、最初の要素を削除するということは、最初の要素へのポインタを変更するだけです。 この操作には、リストのサイズに依存せず、常に同じ時間が必要です。

6. 結論

この記事では、List,から最初の要素を削除する方法について説明し、ArrayListLinkedList の実装に対するこの操作の効率を比較しました。

いつものように、完全なソースコードはover on GitHubで入手できます。