Java

Collections Framework の概要

はじめに

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

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

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


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

14 のコレクションインタフェースがあります。 もっとも基本的なインタフェースは、Collection です。 Collection を拡張するのは、インタフェース SetListSortedSetNavigableSetQueueDequeBlockingQueueBlockingDeque です。 他のコレクションインタフェース、MapSortedMapNavigableMapConcurrentMapConcurrentNavigableMap は、真の意味でのコレクションではなくマッピング表現であるため、Collection を拡張しません。ただし、これらのインタフェースには collection-view オペレーションが含まれているため、コレクションとして操作することが可能です。

コレクションインタフェースの変更メソッドの多くには、「省略可能」というラベルが付いています。実装によっては、いくつかのオペレーションが実行されないことがあります。 実行しようとすると、実行時例外 (UnsupportedOperationException) がスローされます。実装のドキュメントには、実装でサポートされるオプションのオペレーションを記述する必要があります。この仕様を理解するための助けとして、いくつかの用語が導入されています。

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

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


コレクションの実装

一般に、コレクションインタフェースを実装するクラスは、<Implementation-style><Interface> という形式の名前を持ちます。以下の表に、汎用の実装の概要を示します。
 
 
  実装
ハッシュテーブルサイズ変更可能な配列 バランスツリーリンクリスト Hash Table + Linked List
インタフェース SetHashSet   TreeSet   LinkedHashSet
List  ArrayList   LinkedList  
Deque  ArrayDeque   LinkedList  
Map HashMap   TreeMap   LinkedHashMap

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

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


設計目標

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

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

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

  1. 真に「基礎的なオペレーション」である。つまり、このメソッドを利用して他のメソッドを定義可能である
  2. 重要な実装がそのメソッドをオーバーライドすることを望むだけの、パフォーマンス上の強力な理由がある

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


Copyright © 1995-2004 Sun Microsystems, Inc.All Rights Reserved.



コメントの送付先:collections-comments@java.sun.com
Sun
Java Software