キューがインターフェイスであるのに、StackやArrayListなどの他のクラスがクラスであるのはなぜですか?
インターフェイスは、クライアントがそれらを実装して独自のメソッドを追加できるように作成されていることを理解していますが、クラスでは、すべてのクライアントがそこでメソッドを必要とする場合、インターフェイスは巨大で肥大化するでしょう。
...または私はここで何かが欠けていますか?
は、またはと同様に、さまざまなQueue
方法で実装できます。それらはすべて、さまざまな種類のコレクションの契約を指定するだけです。List
Set
ArrayList
ただし、は、List
要素を格納するために配列を内部的に使用するように作成された、の特定の実装です。は、一連の相互接続されたノード、つまり二重リンクリストLinkedList
を使用するの実装でもあります。同様に、とはそれぞれセットとマップの特定の実装です。List
TreeSet
HashMap
さて、Stack
ここでは奇妙なケースです。特に、古いバージョンのJavaのレガシークラスであるためです。あなたは本当にStack
もう使うべきではありません。代わりに、その最新の同等物であるを使用する必要がありますArrayDeque
。ArrayDeque
はDeque
(両端キュー)の実装であり、内部的に配列をストレージに使用します(これがまさにそのStack
機能です)。Aは、などのDeque
すべての操作をサポートします。他の誰かが言及したように、 includeの他の実装は、その基礎となる配列ではなく、二重にリンクされたリストから逸脱しています:-pStack
pop
push
Deque
LinkedList
Stack
現在、の実装はたくさんあり、Queue
さまざまな種類のがありQueue
ます。BlockingQueue
s(生産者/消費者によく使用されます)があり、その一般的な実装にはとが含まれLinkedBlockingQueue
ているだけArrayBlockingQueue
でなく、TransferQueue
sなども含まれています。私は逸脱します...関連するJavaチュートリアルでコレクションAPIの詳細を読むことができます。
インターフェースの概念を正しく理解できます。この場合、Java標準ライブラリはすでに実装とインターフェースの両方を提供しています。いつでも実装を切り替えることができるように、インターフェイスを使用することをお勧めします。
それが理にかなっていることを願っています。
インターフェイスがリストとキューに使用される理由は、過剰なコードを減らすため ではありません。
インターフェイスの主な利点は、柔軟で疎結合のコードを記述できることです。
(これは、この概念を完全に説明する素晴らしい答えです)
インターフェイスは、クラスによって実装されるメソッドのリストを定義するだけです。
これにより、非常に強力なことが可能になります。
これは大きな利点です。
非常に簡単な例を次に示します。
コレクション内のすべての要素を出力するデバッグメソッドを作成します。
コレクションはインターフェースです。操作のリストを定義し、それらを実装しません。
コレクションをインスタンス化することはできません。Collectionを実装するクラスをインスタンス化できます。
Collectionを実装するクラスはたくさんあります:ArrayList、Vector、TreeSet、LinkedListなど。これらはすべて異なる洗練された機能を備えていますが、共通点もあります。各クラスはCollectionを実装しているため、ここにある各メソッドを実装しています。
これにより、非常に強力なことが可能になります。
次のようになります。
public void printCollection(Collection semeCollection) {
for (Object o : someCollection) {
String s = (o == null) ? "null" : o.toString();
System.out.println(s);
}
}
インターフェイスの魔法のおかげで、次のことができるようになりました。
public void testStuff() {
Collection s = new TreeSet();
Collection a = new ArrayList();
Collection v = new Vector();
s.add("I am a set");
a.add("I am an array list");
v.add("I am a vector");
printCollection(s);
printCollection(a);
printCollection(v);
}
Stack
インターフェースとなるべきクラスとして有名だと思います。インターフェースを提供することを正しく選択することになると、Javaライブラリーは少し行き当たりばったりです。
ArrayList
はList
インターフェースの単なる実装であるため、Sunはそこで正しくそれを取得しました!もう1つの古典的なミス(私の意見では)はObservable
クラスです。これは、単なるクラスではなく、インターフェイスのデフォルトの実装である必要があります。
興味深い質問です。これについての私の考えQueue
は、BlockingQueue、PriorityQueue、Dequeなどの多くのデータ構造の基礎です。この一連のクラスには、さまざまな操作のための特定の実装が必要であるためQueue
、インターフェイスとして作成する方がはるかに簡単です。