重複の可能性:
List と ArrayList とは?
どちらも使ったことがあるのですが、それぞれのメリットとデメリットを教えてください。主な違いは何ですか?また、どちらが使いやすいですか?
ありがとう。
重複の可能性:
List と ArrayList とは?
どちらも使ったことがあるのですが、それぞれのメリットとデメリットを教えてください。主な違いは何ですか?また、どちらが使いやすいですか?
ありがとう。
List
クラスによって実装されるインターフェースです。のもう 1 つのよく知られた実装はです。ArrayList
List
LinkedList
ArrayList
一定時間のランダムアクセスをLinkedList
提供し、非シーケンシャルアクセスには一定時間を提供します。を保持する変数を宣言するときはArrayList
、次のようにインターフェイスを介してアクセスすることを検討してください。
List<ElementType> myList = new ArrayList<ElementType>();
これにより、残りのコードに影響を与えることなく、別の実装に切り替えることができます。
List
リストであることの意味の契約を説明するだけです。そのため、これは具体的な実装ではなく、単なるインターフェイスです。リストはさまざまな方法で実装できます。
特に、ArrayList
すべての要素を順番に格納するための動的配列を内部的に保持するがあります。またLinkedList
、要素を二重にリンクされたリスト、つまり前のノードと次のノードへの参照を保持するノードのシーケンスとして格納するがあります。
Vector
もう1つは、その実装が動的配列に基づいているという点List
で非常に似ています。ArrayList
ただし、これは古いバージョンのJavaの遺物であり、完全に同期されることでスレッドセーフであることが保証されています。実際には、 new Vector<T>()
は多かれ少なかれと同等Collections.synchronizedList(new ArrayList<T>())
です。
を使用する理由List
は、リストをさまざまな方法で実装できるためです。そうは言っても、多くの場合、すべてに適用できるある種の一般的な動作が必要になりますList
...ポリモーフィズムを参照してください。
他のポスターはすでにあなたの質問の「何」の部分に答えました。それらの間で選択するときに考慮すべきいくつかの考慮事項。
ArrayListは、舞台裏で配列を使用します。したがって、インデックスによるアクセスは一定時間で実行できます。アレイに十分なスペースが割り当てられている場合は、追加を一定時間で行うこともできます。ただし、スペースがなくなると、ArrayListはより大きな配列を割り当て、古い配列値を新しい配列にコピーします。
LinkedListは、一緒にチェーンされたノードを使用します。インデックスによるアクセスには、リスト全体を歩く必要がある可能性があります(線形時間)。挿入に必要なのは、新しいノードを作成して最後に追加することだけです(テールポインターが維持されている場合は一定の時間になる可能性があります)。
したがって、「どちらが優れているか」は、それをどのように使用しているかによって異なります。正直なところ、私は2つの間のパフォーマンスの違いを測定したことはありませんが、それは考慮すべきことです。
Listはインターフェースであり、ArrayListはそのインターフェースの実装です。ArrayList は List であり、LinkedList、Stack、Vector なども同様です。