カードを配るときは、単にカードにアクセスすることとは異なり、デッキからカードを取り除くことになります。カードへのアクセスは一定時間ですが、削除はそうではありません。から削除する場合ArrayList
、リスト内のすべての要素を再配置する必要があります。メソッドのこの実装を検討してくださいremove
(OpenJDKから)
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
したがって、リストの先頭にある要素が移動された場合、配列全体をシフトする必要があります。
現在のLinkedList
実装では、各ノードは次のノードへのポインターを維持するだけなので、削除は簡単で、前のノードのリンクを変更するだけです。remove
inのこの実装を考えてみましょうLinkedList
(これも OpenJDK から):
private E remove(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
LinkedList
これは、すべての状況で s が優れていると言っているわけではありません。配列のランダムなインデックスにアクセスする必要がある場合、ArrayList
通常は の方がはるかに効率的です (aLinkedList
は、そのインデックスが見つかるまで、最後の最初から各ノードをトラバースする必要があります)。