Collections Frameworkの概要

はじめに

Javaプラットフォームには、Collections Frameworkが追加されました。コレクションとは、オブジェクトのグループを表すオブジェクト(古典的なVectorクラスなど)のことです。Collections Frameworkとは、コレクションを表したり操作したりする、統一されたアーキテクチャのことで、実装の詳細に依存しない方法でコレクションを操作することができます。

Collections Frameworkの主な利点は、次のとおりです。

Collections Frameworkは、次の要素で構成されます。


コレクション・インタフェース

コレクション・インタフェースは2つのグループにわかれます。もっとも基本的なインタフェースはjava.util.Collectionで、次の子孫があります。

そのほかのコレクション・インタフェースは、java.util.Mapに基づいていて、真の意味でのコレクションではありません。ただし、これらのインタフェースにはcollection-viewオペレーションが含まれているため、コレクションとして操作することが可能です。Mapには、次の子孫があります。

コレクション・インタフェースの変更メソッドの多くには、オプションというラベルが付いています。実装では、これらのオペレーションのいくつかが試みられた場合に、それらを実行せず、実行時例外(UnsupportedOperationException)をスローすることが許可されています。各実装のドキュメントでは、サポートされるオプションのオペレーションを指定する必要があります。この仕様を理解するための助けとして、いくつかの用語が導入されています。

実装によっては、格納する要素(Mapsの場合はキーおよび値)を限定する場合があります。要素を限定する条件には、次のようなものがあります。

実装の制限に適合しない要素を追加しようとすると、実行時例外が発生します。典型的な実行時例外には、ClassCastExceptionIllegalArgumentException、またNullPointerExceptionがあります。実装の制限に適合しない要素を削除またはテストしようとすると、例外が発生することがあります。制限付きのコレクションによっては、その使用法を許可していることがあります。


コレクションの実装

一般に、コレクション・インタフェースを実装するクラスは、<Implementation-style><Interface>という形式の名前を持ちます。次の表に、汎用の実装の概要を示します。

インタフェース ハッシュ表 サイズ変更可能な配列 バランス・ツリー リンク・リスト ハッシュ表+リンク・リスト
Set HashSet   TreeSet   LinkedHashSet
List   ArrayList   LinkedList  
Deque   ArrayDeque   LinkedList  
Map HashMap   TreeMap   LinkedHashMap

汎用の実装は、コレクション・インタフェースのオプションのオペレーションをすべてサポートしています。また、格納する要素に制限はありません。これらの実装は非同期ですが、Collectionsクラスには、同期ラッパーと呼ばれるstaticファクトリが含まれます。同期ラッパーは、同期をとらない多くのコレクションに同期をとる機能を追加するために使用されます。新規の実装にはすべて、フェイルファスト・イテレータが含まれます。フェイルファスト・イテレータは、無効な並列変更を探知し、すばやくクリーンにフェイルします。不規則な動作はしません。

AbstractCollectionAbstractSetAbstractListAbstractSequentialList、およびAbstractMapクラスは、コア・コレクション・インタフェースの基本的な実装を提供し、実装に必要な手間を最小限に抑えます。これらのクラスのAPIドキュメントには、各メソッドがどのように実装されているかが説明されているため、実装者は、特定の実装の「基本オペレーション」のパフォーマンスに基づき、どのメソッドをオーバーライドしたらよいかがわかります。


並行処理コレクション

複数のスレッドからのコレクションを使用するアプリケーションは、慎重にプログラミングする必要があります。一般に、これは並行プログラミングと呼ばれます。Javaプラットフォームは、並行プログラミングを幅広くサポートします。詳細については、「Java並行処理ユーティリティ」を参照してください。

コレクションは使用頻度が高いため、コレクションの並行処理に適した各種のインタフェースおよび実装がAPIに含まれています。これらのタイプは、前述の同期ラッパーを超えて、並行プログラミングで頻繁に必要とされる機能を提供します。

並行処理に対応するこれらのインタフェースを使用できます。

並列処理に対応する次の実装クラスを使用できます。これらの実装の適切な使用法については、APIドキュメントを参照してください。


設計目標

設計上の主要な目標は、実際のサイズにおいて、またより重要性の高い「概念の重さ」においても小さいAPIを作成することでした。現在のJavaプログラマにとって、この新機能が大きく違うものには見えないようにするということも非常に重要な点でした。このため、既存の機能を置き換えるのではなく、機能を追加する必要がありました。同時に、この新しいAPIは、前述の利点すべてを提供できるような強力なものにする必要がありました。

コア・インタフェースを小さく保つために、インタフェースはこのようなわずかな違いを可変、修正、サイズ変更としてはとらえません。コア・インタフェースでのある種の呼出しはオプションであり、実装は、特定の省略可能なオペレーションに関してはUnsupportedOperationExceptionをスローして、サポートしないことを示せるようにしました。コレクションの実装者は、実装がオプションのオペレーションのうち、どれをサポートしているかをドキュメントに明示する必要があります。

各コア・インタフェース内のメソッドの数を少数に保つために、メソッドが次のどれかの場合にだけ、インタフェースはメソッドを格納します。

コレクションの妥当な表現が、すべて相互運用可能であることは重要な要件です。この表現には配列が含まれます。配列は、言語を変えずに直接Collectionインタフェースを実装することはできません。このため、フレームワークには、コレクションを配列に移動すること、配列をコレクションとみなすこと、およびマップをコレクションとみなすことを可能にするメソッドが含まれています。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.