2011-07-29 8 views
19

2つのオブジェクトの基本的な違いは何ですか?もう一つ効率的ですか? 1つ以上のメソッドがありますか?List対ArrayListとは何ですか?

+6

gosh、*これはこれまでに聞いたことがありません! OPに質問する前に、まずフォーラムを検索することを検討してください。 –

+0

@Hovercraft、以前は聞かれたことはありませんか? – Atreys

+5

再オープンする投票 - リンクされた投稿が重複しているとは思わない。これはインタフェースと実装のコーディングについてですが、これは実際に 'List'と' ArrayList'の違いを尋ねています。 –

答えて

23

リストはインターフェイスにあり、ArrayListはクラスです。

ArrayListおよびListを参照してください。それはインターフェースなので...

List<String> list = new List<String>();

例えば、あなたは、この設定を使用することはできません。

しかし、この作品:duffymoは以下の言うよう

ArrayList<String> arrayList = new ArrayList<String>();

をも...あなたはListインターフェース(独自のリストの実装を行うこと)を実装と同じ多かれ少なかれである、行うことができます。

+3

いいえ、でもこれを行うことができます:List list = new List (){//ここにすべてのListメソッドを実装します。}; – duffymo

2

Listは、ArrayListが使用するインターフェイスを定義しているため、Listを実装する他のすべてのクラスを一緒にまたは同様の方法で使用できるようにするメソッドを実装できます。 ArrayListも常にListですが、Listは必ずしもArrayListである必要はありません。

つまり、ArrayListList(他のいくつかのインターフェイスの中で)を実装しています。

13

リストはインターフェイスです。 ArrayListは、Listインタフェースを実装するクラスです。

インターフェイスは、必要なメソッドシグネチャを定義しますが、実装方法については何も言いません。

インターフェイスを実装するクラスは、インターフェイスによって宣言された同一のシグネチャを持つメソッドのパブリック実装を提供することを約束します。

-1

java docsによれば、Listは単なるインタフェースであり、ArrayListはそれを実装するクラスの1つです。 ArralyListをArrayListオブジェクトへのList型の参照の代わりに使用することには、固有の効率的な利点はありません。

しかし、「効率」について言えば、Listインターフェイスのさまざまな実装に違いがある可能性があります。たとえば、LinkedListとArrayListの間の効率の差は、使用方法によって異なります。

ArrayListページ上のJavaドキュメントを引用すると追加操作は、一定の償却時間で、つまり、n個の要素を追加すると、O(n)の時間を必要と実行されます。他のすべての操作は、線形時間(大まかに言えば)で実行されます。 Constant FactorはLinkedList実装の場合と比較して低くなります。

つまり、パフォーマンスの差はごくわずかですが、(LinkedListではなく)ArrayListを使用すると、いくつかの利点があります。

あなたが興味をお持ちの場合、ArrayListは、時折リサイズされる配列で実装されています(おそらくコレクションが2倍になるたびに)。これはLinkedListの実装とはかなり異なります。詳細については、wikipediaを参照してください。 )。

+1

彼はそうではありません。彼はいつListを使うべきか、ArrayListを使うべきかを尋ねています。これまでのすべての回答が示していたように、LinkedListには入っていません。 LinkedListは、この特定の質問に対する誤った指示です。 – RichieHH

16

次のような行を考えてみましょう:

List<String> names = new ArrayList<String>(); 

あなたはオブジェクト指向するアーキテクチャを新たにしている場合は、あなたがArrayList<String> names = new ArrayList<String>();のようなものを見るために代わりに期待しているかもしれません。結局のところ、新しいArrayListだから、ArrayListという変数に格納しないでください。

さて、あなたは確かにそれを行うことができます。しかし、Listは、ArrayListが継承していると言われるソートのテンプレートのようなインターフェイスです。 「Listの実装を使用する場合はいつでも、これらのメソッドを使用できると期待できます」という契約です。 Listの場合は、方法等、addgetのようなものです

しかしArrayListListの唯一の実装です。 LinkedListのようなものもあります。 2つは同じインターフェイスを持ち、同じ方法で使用できますが、背後では非常に異なる動作をします。 ArrayListは「ランダム」アクセスです。つまり、配列全体を繰り返し処理することなく、配列の特定の要素を直接見つけることができます。LinkedListは最初の要素から開始し、必要な要素に到達するまで1つずつ進む必要があります。

オブジェクトを作成するときに指定する必要があるのは、通常、それがListであるという事実だけを伝える必要があります。 Listは、あなたが指定した順番になるよう意図されたコレクションを持っていることを伝えます。それほど通信する必要がない場合は、別のインターフェイス(Listのスーパーインターフェイス)であるCollectionとして渡すことを検討することもできます。または、通信する必要がある場合は、それを反復処理できるということであれば、Iterableと呼ぶことさえできます。

1

リストとArrayList、またはリストの他の実装の使い方は、PolymorphismInheritanceです。また、Javaなどの言語を使用する理由もあります。

多形は、継承が再利用されている間、多くの形式です。

ArrayList、VectorLinkedListStackなど、利用可能なリストが多数あります。あなたからの使用を決定し、List APIを見ると、これらのList実装はすべてListのいずれかの方法で拡張されています。

関連する問題