Collections Frameworkの拡張機能
このページでは、JDKバージョン5のCollections Frameworkの拡張機能について説明します。
次の3つの新しい言語機能がCollections Frameworkを飛躍的に拡張します。
- ジェネリックス - コンパイル時の型保証がCollections Frameworkに追加され、コレクションから要素を読み込むときにキャストが不要。
- 拡張されたforループ - コレクション上で対話する場合に、明示的なイテレータが不要。
- オートボクシング/アンボクシング - コレクションに挿入する場合に、プリミティブ・クラス(intなど)をラッパー・クラス(Integerなど)に自動的に変換し、コレクションから読み取る場合にラッパー・クラスのインスタンスをプリミティブ・クラスに変換する。
3つの新しいコレクション・インタフェースが提供されます。
- Queue - 処理を行う前に要素を保持するために設計されたコレクション。基本的なCollectionオペレーションだけでなく、キューは追加の挿入、抽出、および検査オペレーションを提供する。
- BlockingQueue - 要素を取り出すときに、キューを空にしないために待機するようQueueを拡張する。また、要素を格納するときにキューで利用可能になる領域を待機する(このインタフェースは、新しいjava.util.concurrentパッケージの一部になる)。
- ConcurrentMap - 基本メソッド、putIfAbsent、removeおよびreplaceを使用する、拡張Map。(このインタフェースは、java.util.concurrentの一部です)。
2つの新しい具象Queue実装が提供されます。1つの既存のList実装がQueueを実装するために改良され、1つの抽象Queue実装が提供されます。
5つの新しいBlockingQueue実装が提供され、そのすべてはjava.util.concurrentの一部です。
1つのConcurrentMap実装が提供されます。
- ConcurrentHashMap - ハッシュ表に基づく、高度に並列化された高性能なConcurrentMap実装。この実装は取得を実行するときにブロックせず、クライアントに更新の並行処理レベルの選択を許可します。これは、Hashtableに対するドロップイン式の置換えとして想定されました。ConcurrentMapを実装することに加えて、Hashtableに固有のすべての「レガシー」メソッドをサポートします。
特殊目的のListおよびSet実装は、読込み操作が書込み操作よりもはるかに多く、反復が同期できない、またはするべきではない場合に使用します。
- CopyOnWriteArrayList - 配列に基づくList実装。すべての変更オペレーション(add、set、removeなど)は、配列の新しいコピーの作成により実装される。反復中でも同期は不要であり、イテレータはConcurrentModificationExceptionをスローしないことが保証される。この実装はイベント・ハンドラ・リストの維持に最適(変更がまれで、トラバーサルは頻繁に発生し、時間がかかる可能性があるため)。
- CopyOnWriteArraySet - copy-on-write配列を基とするSet実装。この実装はCopyOnWriteArrayListと本質的に同様。ほとんどのSet実装と異なり、add、remove、およびcontainsメソッドでは、メソッドはセットのサイズに比例する時間が必要。この実装は、重複を回避する必要があるイベント・ハンドラ・リストの維持に最適。
特殊目的のSetおよびMap実装は、列挙型と一緒に使用します。
- EnumSet - bit-vectorを基とする高性能のSet実装。各EnumSetインスタンスのすべての要素は、単一の列挙型の要素でなければならない。
- EnumMap - 配列を基とする高性能のMap実装。各EnumMapインスタンスのすべてのキーは、単一の列挙型の要素でなければならない。
新しいラッパー実装のファミリが提供され、主にジェネリック・コレクションとともに使用されます。
- Collections.checkedInterface - 指定されたコレクションの動的型保証ビューを返し、クライアントが間違った型の要素を追加しようとした場合ClassCastExceptionをスローする。言語にあるジェネリック・メカニズムによりコンパイル時に静的な型チェックが行われるが、このメカニズムを無効化することも可能。動的型保証ビューはこの可能性を完全に解決する。
3つの新しいジェネリック・アルゴリズムと1つのコンパレータ・コンバータがCollectionsユーティリティ・クラスに追加されました。
Arraysユーティリティ・クラスは、すべての型の配列に対する、コンテンツベースのhashCodeおよびtoStringメソッドに装備されました。これらのメソッドは既存のequalsメソッドを補完します。入れ子になった(多次元な)配列の操作を行うために、3つのメソッドのバージョンが提供されます。それらは、deepEquals、deepHashCodeおよびdeepToStringです。任意の配列の内容を容易に出力できます。「平坦な」配列を出力するコードを次に示します。
System.out.println(Arrays.toString(a));
入れ子の(多次元な)配列を出力するコードを次に示します。
System.out.println(Arrays.deepToString(a));
Booleanは、Comparableを実装するために改良されました。