Collections Frameworkの主な利点は、次のとおりです。
Collections Frameworkは、次の要素で構成されます。
Vector
やHashtable
など、以前にリリースされたコレクション・クラスが改良されて、コレクション・インタフェースを実装した。 コレクション・インタフェースは2つのグループにわかれます。 もっとも基本的なインタフェースはjava.util.Collection
で、次の子孫があります。
java.util.Set
java.util.SortedSet
java.util.NavigableSet
java.util.Queue
java.util.concurrent.BlockingQueue
java.util.concurrent.TransferQueue
java.util.Deque
java.util.concurrent.BlockingDeque
そのほかのコレクション・インタフェースは、java.util.Map
に基づいていて、真の意味でのコレクションではありません。 ただし、これらのインタフェースにはcollection-viewオペレーションが含まれているため、コレクションとして操作することが可能です。 Map
には、次の子孫があります。
java.util.SortedMap
java.util.NavigableMap
java.util.concurrent.ConcurrentMap
java.util.concurrent.ConcurrentNavigableMap
コレクション・インタフェースの変更メソッドの多くには、オプションというラベルが付いています。 実装では、これらのオペレーションのいくつかが試みられた場合に、それらを実行せず、実行時例外(UnsupportedOperationException
)をスローすることが許可されています。 各実装のドキュメントでは、サポートされるオプションのオペレーションを指定する必要があります。 この仕様を理解するための助けとして、いくつかの用語が導入されています。
add
、remove
、clear
など)をサポートしないコレクションのことを変更不可能であるという。 変更不可能ではないコレクションは変更可能である。 Collection
オブジェクト内にどのような変更も見られないことを保証するコレクションは、不変であるという。 不変ではないコレクションは可変である。 RandomAccess
マーカー・インタフェースを使用すると、リストでランダム・アクセスをサポートすることを通知することができる。 これによりジェネリック・アルゴリズムがランダム・アクセス・リストまたは順次アクセス・リストのいずれかに適用されるとき、その動作を変更してパフォーマンスを向上することができる。 実装によっては、格納する要素(Maps
の場合はキーおよび値)を限定する場合があります。 要素を限定する条件には、次のようなものがあります。
実装の制限に適合しない要素を追加しようとすると、実行時例外が発生します。典型的な実行時例外には、ClassCastException
、IllegalArgumentException
、またNullPointerException
があります。 実装の制限に適合しない要素を削除またはテストしようとすると、例外が発生することがあります。 制限付きのコレクションによっては、その使用法を許可していることがあります。
一般に、コレクション・インタフェースを実装するクラスは、<Implementation-style><Interface>という形式の名前を持ちます。 次の表に、汎用の実装の概要を示します。
インタフェース | ハッシュ表 | サイズ変更可能な配列 | バランス・ツリー | リンク・リスト | ハッシュ表+リンク・リスト |
---|---|---|---|---|---|
Set |
HashSet |
TreeSet |
LinkedHashSet |
||
List |
ArrayList |
LinkedList |
|||
Deque |
ArrayDeque |
LinkedList |
|||
Map |
HashMap |
TreeMap |
LinkedHashMap |
汎用の実装は、コレクション・インタフェースのオプションのオペレーションをすべてサポートしています。また、格納する要素に制限はありません。 これらの実装は非同期ですが、Collections
クラスには、同期ラッパーと呼ばれるstaticファクトリが含まれます。同期ラッパーは、同期をとらない多くのコレクションに同期をとる機能を追加するために使用されます。 新規の実装にはすべて、フェイルファスト・イテレータが含まれます。フェイルファスト・イテレータは、無効な並列変更を探知し、すばやくクリーンにフェイルします。不規則な動作はしません。
AbstractCollection
、AbstractSet
、AbstractList
、AbstractSequentialList
、およびAbstractMap
クラスは、コア・コレクション・インタフェースの基本的な実装を提供し、実装に必要な手間を最小限に抑えます。 これらのクラスのAPIドキュメントには、各メソッドがどのように実装されているかが説明されているため、実装者は、特定の実装の基本オペレーションのパフォーマンスに基づき、どのメソッドをオーバーライドしたらよいかがわかります。
複数のスレッドからのコレクションを使用するアプリケーションは、慎重にプログラミングする必要があります。 一般に、これは並行プログラミングと呼ばれます。 Javaプラットフォームは、並行プログラミングを幅広くサポートします。 詳細については、Java並行処理ユーティリティを参照してください。
コレクションは使用頻度が高いため、コレクションの並行処理に適した各種のインタフェースおよび実装がAPIに含まれています。 これらのタイプは、前述の同期ラッパーを超えて、並行プログラミングで頻繁に必要とされる機能を提供します。
並行処理に対応するこれらのインタフェースを使用できます。
並列処理に対応する次の実装クラスを使用できます。 これらの実装の適切な使用法については、APIドキュメントを参照してください。
LinkedBlockingQueue
ArrayBlockingQueue
PriorityBlockingQueue
DelayQueue
SynchronousQueue
LinkedBlockingDeque
LinkedTransferQueue
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentSkipListSet
ConcurrentHashMap
ConcurrentSkipListMap
設計上の主要な目標は、実際のサイズにおいて、またより重要性の高い概念の重さにおいても小さいAPIを作成することでした。 現在のJavaプログラマにとって、この新機能が大きく違うものには見えないようにするということも非常に重要な点でした。このため、既存の機能を置き換えるのではなく、機能を追加する必要がありました。 同時に、この新しいAPIは、前述の利点すべてを提供できるような強力なものにする必要がありました。
コア・インタフェースを小さく保つために、インタフェースはこのようなわずかな違いを可変、修正、サイズ変更としてはとらえません。 コア・インタフェースでのある種の呼出しはオプションであり、実装は、特定の省略可能なオペレーションに関してはUnsupportedOperationException
をスローして、サポートしないことを示せるようにしました。 コレクションの実装者は、実装がオプションのオペレーションのうち、どれをサポートしているかをドキュメントに明示する必要があります。
各コア・インタフェース内のメソッドの数を少数に保つために、メソッドが次のどれかの場合にだけ、インタフェースはメソッドを格納します。
コレクションの妥当な表現が、すべて相互運用可能であることは重要な要件です。 この表現には配列が含まれます。配列は、言語を変えずに直接Collection
インタフェースを実装することはできません。 このため、フレームワークには、コレクションを配列に移動すること、配列をコレクションとみなすこと、およびマップをコレクションとみなすことを可能にするメソッドが含まれています。
Copyright © 1998, 2017, Oracle and/or its affiliates. 500 Oracle Parkway
Redwood Shores, CA 94065 USA. All rights reserved.