Javaコレクションフレームワーク

Java コレクション フレームワークのクラスとインターフェースの階層図
Javaコレクションフレームワークのクラスとインターフェース階層(java.util.concurrentパッケージ内の型と他のいくつかのクラスを除く)

Javaコレクションフレームワークは一般的に再利用可能なコレクションデータ構造コレクション)を実装するクラスインタフェースのセットです。[ 1 ]

フレームワークと呼ばれていますが、ライブラリのように機能します。コレクションフレームワークは、様々なコレクションを定義するインターフェースと、それらを実装するクラスの両方を提供します。

配列との違い

Collectionsと配列は、どちらもオブジェクトへの参照を保持し、それらをグループとして管理できるという点で似ています。ただし、配列とは異なり、Collectionsはインスタンス化時に特定の容量を割り当てる必要がありません。sCollectionは、オブジェクトが追加または削除されると、サイズが自動的に拡大または縮小されます。

Collectionintは、、、longなどのプリミティブデータ型を保持できませんdouble[ 2 ]代わりに、は、、、、などのラッパークラスCollectionを保持できます。[ 3 ]java.lang.Integerjava.lang.Longjava.lang.Double

Collectionはジェネリックなので不変ですが、配列は共変Collectionです。これは、配列と比較した場合のジェネリックオブジェクトの利点と考えることができます。なぜなら、状況によっては、Collection配列の代わりにジェネリックを使用すると、代わりにコンパイル時例外がスローされ、開発者にコードを修正するように通知されるため、実行時例外が防止されるからです。たとえば、開発者がオブジェクトを宣言しObject[]、そのオブジェクトを特定の容量を持つObject[]新しいインスタンスによって返された値に代入した場合Long[]、コンパイル時例外はスローされません。開発者がStringこのLong[]オブジェクトに を追加しようとすると、Javaプログラムは をスローしますArrayStoreException。一方、開発者が の新しいインスタンスを として宣言した場合Collection<Object>ArrayList<Long>Javaコンパイラは(正しく)コンパイル時例外をスローし、コードが互換性のない誤った型で記述されていることを示します。これにより、潜在的な実行時例外が防止されます。開発者は、オブジェクトCollection<Object>としてインスタンス化することでコードを修正できますArrayList<Object>。コードがJava SE7以降のバージョンを使用している場合、開発者はダイヤモンド演算子[ 2 ]を使用してオブジェクトCollection<Object>としてインスタンス化できます。ArrayList<>

Collectionはジェネリックなので具象化されているが、配列は具象化されていない。[ 2 ]

歴史

JDK 1.2以前のJavaプラットフォームのコレクション実装には、データ構造クラスがいくつか含まれていましたが、コレクションフレームワークは含まれていませんでした。 [ 4 ] Javaオブジェクトをグループ化する標準的な方法は、配列、、クラスでしたがVectorHashtable残念ながら拡張が容易ではなく、標準的なメンバーインターフェースを実装していませんでした。[ 5 ]

再利用可能なコレクションデータ構造の必要性に応えるため、いくつかの独立したフレームワークが開発されました。[ 4 ]最もよく使われているのはDoug Leaコレクションパッケージ[ 6 ]ObjectSpace Generic Collection Library (JGL) [ 7 ]です。その主な目的はC++標準テンプレートライブラリ(STL)との整合性でした。[ 8 ]

コレクションフレームワークは主にJoshua Blochによって設計・開発され、JDK 1.2で導入されました。Doug LeaのCollectionsパッケージから多くのアイデアとクラスを再利用していましたが、結果として同パッケージは非推奨となりました。[ 6 ] Sun Microsystemsはコンパクトなフレームワークを求めており、C++との一貫性は目標としていなかったため、JGLのアイデアを採用しませんでした。[ 9 ]

Doug Leaは後に、新しいコレクション関連のクラスを含む並行性パッケージを開発しました。 [ 10 ]これらの並行性ユーティリティの更新バージョンは、JSR 166の時点でJDK 5.0に含まれていました。

建築

マップではない Java のほとんどのコレクションは、java.util.Collectionインターフェースから派生されます。Collectionすべてのコレクションの基本部分を定義します。

インターフェースには、それぞれに追加するメソッドと から削除するメソッドがadd(E e)あります。また、を(戻り値の型は)内の の配列に変換する メソッドもあります。[ 11 ]最後に、 メソッドは指定された要素が に存在するかどうかを確認します。 remove(E e)CollectiontoArray()CollectionObjectCollectionObject[]contains(E e)Collection

インターフェースCollectionは のサブインターフェースなjava.lang.Iterableので、任意の がfor-eachCollection文のターゲットになる場合があります。 (インターフェースは、 for-each 文で使用される メソッドを提供します。)すべてのは を実装して内のすべての要素をスキャンします。 Iterableiterator()Collectionjava.util.IteratorCollection

Collectionはジェネリックです。任意の はCollection任意の を格納できますObject。例えば、 の実装にはオブジェクトがCollection<String>含まれます。の実装からオブジェクトStringを使用する場合、キャストは必要ありません。[ 12 ]山括弧内には、がどの型を保持するかを指定する型引数を含めることができることに注意してください。[ 13 ]StringCollection<String>< >Collection

収集フレームワーク

コレクション フレームワークは、コレクション インターフェイスに従うリストなどのすべてのコレクション (一般的な概念) を保持します。

コレクションの種類

コレクションには、キューマップリストセットなど、いくつかの種類があります。

キューを使用すると、プログラマーは特定の順序でアイテムを挿入し、同じ順序でそれらのアイテムを取得できます。例としては、待機リストが挙げられます。キューの基本インターフェースは と呼ばれますQueue

辞書/マップは、オブジェクトの値にアクセスするための参照キーを持つオブジェクトへの参照を格納します。キーの一例として、身分証明書が挙げられます。辞書/マップの基本インターフェースは と呼ばれますMap

リストは、同じ値を複数回保存できる有限のコレクションです。

集合は順序のないコレクションであり、反復処理が可能で、各要素を最大1回しか格納できません。集合の基本インターフェースは と呼ばれますSet[ 3 ]

リストインターフェース

リストは、コレクションフレームワークのインターフェースを介して実装されていますjava.util.List。このインターフェースは、リストを本質的に配列のより柔軟なバージョンとして定義します。要素には特定の順序があり、重複要素が許可されています。要素は特定の位置に配置できます。また、リスト内で要素を検索することもできます。

リスト実装

を実装する具体的なクラスはいくつかありList、これにはAbstractListとその対応するサブクラスすべて、および が含まれますCopyOnWriteArrayList

AbstractListクラス

AbstractListクラスの直接のサブクラスにはAbstractSequentialList、、ArrayListおよびが含まれますVector

AbstractListはスケルトン実装の一例であり、インターフェースと抽象クラスの利点を活用して組み合わせることで、開発者が特定のインターフェースに対して独自の実装を容易に開発できるようにしています。[ 14 ]

ArrayListクラス

クラスjava.util.ArrayListは をList配列として実装します。 に固有の関数がList必要な場合は、クラスは配列内の要素を移動して関数を実行します。

LinkedListクラス

クラスjava.util.LinkedListは、要素をノードに格納します。ノードはそれぞれ、クラス内の前後のノードへのポインタを持ちますList。クラスListはポインタを辿ることで走査でき、ポインタを変更してノードを適切な位置に配置するだけで、要素を追加または削除できます。[ 15 ]

ベクトルクラス

このVectorクラスは直接のサブクラスを持っています。これは、Javaプラットフォームライブラリにおける継承よりも構成Stackの原則に違反する例です。コンピュータサイエンスでは、ベクターは一般的にスタックではないからです。[ 16 ]このシナリオでは、構成の方が適切だったでしょう。[ 16 ]

スタッククラス

クラスStackクラスextendsには、 を として扱うjava.util.Vectorための 5 つの操作があります。スタックは を使って作成されます。 は、新しいオブジェクトを に配置するメソッド(メソッド)と、 からオブジェクトを取得するメソッド(メソッド)を提供します。 は、後入先出法(LIFO)に従ってオブジェクトを返します。つまり、 に最後に配置されたオブジェクトが最初に返されます。は、Java が提供するスタックの標準実装です。 VectorStackjava.util.StackStackStackpush(E e)Stackpop()StackStackjava.util.Stack

クラスStackは、後入れ先出し(LIFO)方式のオブジェクトスタックを表します。Stackクラスには、スタックをVectorスタックとして扱うための5つの追加操作がありますStack。通常の操作push(E e)pop()操作に加え、peek()スタックの先頭の項目を参照するメソッド( )、スタックが空かStackどうかをテストするメソッド( )、スタック内で項目を検索し、その項目が先頭からどれだけ離れているかを調べるメソッド( )が提供されています。スタックが最初に作成された時点では、項目は含まれていません。 Stackempty()Stacksearch(Object o)Stack

CopyOnWriteArrayListクラス

はクラスCopyOnWriteArrayListを拡張しますObjectが、他のクラスを拡張しません。CopyOnWriteArrayList過剰な同期を実行することなくスレッドセーフを可能にします。[ 17 ]

いくつかのシナリオでは、同期は必須です。例えば、メソッドが静的フィールドを変更し、そのメソッドが複数のスレッドから呼び出される必要がある場合、同期は必須であり、のような並行処理ユーティリティはCopyOnWriteArrayList使用すべきではありません。[ 17 ]

しかし、同期はパフォーマンスのオーバーヘッドを引き起こす可能性があります。同期が必須でないシナリオでは、CopyOnWriteArrayList同期の代わりにスレッドセーフな代替手段となる、マルチコアプロセッサを活用しCPU使用率を高める有効な手段があります。 [ 17 ]

キューインターフェース

このjava.util.Queueインターフェースは、要素が挿入された順序で格納されるキューデータ構造を定義します。追加された要素は行の末尾に追加され、先頭の要素は削除されます。これにより、先入先出システムが作成されます。このインターフェースはjava.util.LinkedList、、、java.util.ArrayDequeおよびによって実装されますjava.util.PriorityQueue

キューの実装

AbstractQueueクラス

AbstractQueueクラスの直接のサブクラスに は ArrayBlockingQueue、、、、、。 およびConcurrentLinkedQueueが含まれます。 DelayeQueueLinkedBlockingDequeLinkedBlockingQueueLinkedTransferQueuePriorityBlockingQueue

ArrayDequeと はConcurrentLinkedDeque両方とも を拡張しますAbstractCollectionが、 などの他の抽象クラスは拡張しないことに注意してくださいAbstractQueue

AbstractQueueスケルトン実装の例です。

PriorityQueueクラス

クラスjava.util.PriorityQueueはを実装するjava.util.Queueだけでなく、それを変更します。[ 18 ]PriorityQueueには追加のcomparator()メソッドがあります。[ 18 ]要素は挿入された順序ではなく、優先度によって順序付けられます。優先度を決定するために使用されるメソッドは、java.lang.Comparable#compareTo(T)要素内のメソッド、またはコンストラクタで指定されたメソッドのいずれかです。クラスは、アイテムをソートするためにヒープを使用してこれを作成します。[ 19 ]

ConcurrentLinkedQueueクラス

クラスはjava.util.concurrent.ConcurrentLinkedQueueを拡張し、インターフェースを実装します。[ 20 ]java.util.AbstractQueueConcurrentLinkedQueuejava.util.Queue

クラスConcurrentLinkedQueueはスレッドセーフなコレクションです。なぜなら、クラス内に置かれた任意の要素についてConcurrentLinkedQueue、Javaコレクションライブラリは、どのスレッドでもコレクションから要素を取得できるようにすることで、要素が安全に公開されることを保証するからです。 [ 21 ]オブジェクトは、そのオブジェクトの状態が他のすべてのスレッドに同時に表示される場合、安全に公開されていると言われます。 [ 21 ]安全な公開には通常、公開スレッドと消費スレッドの同期が必要です。[ 21 ]

BlockingQueueインターフェース

インターフェースは java.util.concurrent.BlockingQueue拡張されますQueue[ 20 ]

インターフェースBlockingQueueには、次の直接サブインターフェースがあります:BlockingDequeおよびTransferQueueBlockingQueue通常の のように動作しますQueueが、 への追加と からの削除はBlockingQueueブロッキングです。[ 22 ]remove(Object o)が空の で呼び出された場合 BlockingQueue、 にアイテムが追加されるまで指定された時間または無期限に待機するように設定できますBlockingQueue。同様に、 メソッドを使用してアイテムを追加すると、add(Object o)にオプションの容量制限が適用されBlockingQueue、 メソッドは に戻る前に にスペースが空くのを待つことができますBlockingQueue。インターフェースは、 の先頭を削除して取得し、必要に応じて が空でなくなるまで待機するBlockingQueueメソッドを導入します。 [ 23 ] [ 24 ]take()BlockingQueueBlockingQueue

両端キュー(Deque)インターフェース

インターフェースはインターフェースDequeを拡張するQueue[ 25 ]Dequeは両端キューを作成する。通常のキューQueueでは挿入は後方、削除は前方のみであるのに対し、キューではDeque前方と後方の両方から挿入または削除を行うことができる。Aは前方または後方、あるいはその両方を同時に使用できるDequeキューに似ているQueue。さらに、前方イテレータと後方イテレータの両方を生成できる。インターフェースはとDequeによって実装される。[ 26 ]java.util.ArrayDequejava.util.LinkedList

デキュー実装

LinkedListクラス

LinkedListもちろん、 もListインターフェースを実装しており、インターフェースとして用いることもできます。しかし、 にもQueueメソッドがあります。はインターフェースLinkedListを実装しておりjava.util.Deque、より柔軟性に優れています。[ 27 ]

ArrayDequeクラス

ArrayDequeQueue配列として実装します。と同様にLinkedListArrayDequejava.util.Dequeインターフェースを実装します。[ 27 ]

BlockingDequeインターフェース

インタフェースjava.util.concurrent.BlockingDequeはを拡張するjava.util.concurrent.BlockingQueue[ 25 ]BlockingDequeはに似ているBlockingQueue。挿入と削除のための同じメソッドを提供し、挿入または削除が可能になるまでの待機時間に制限を設ける。しかし、インタフェースはの柔軟性も提供するDeque。挿入と削除は両端で行うことができる。ブロッキング機能はDeque機能と組み合わされている。[ 28 ]

インターフェースを設定する

Javaのjava.util.Setインターフェースは を定義しますSet。ASetには重複する要素を含めることはできません。また、 にはSet順序が設定されていません。そのため、要素をインデックスで検索することはできません。は、、Setによって実装されています。 java.util.HashSetjava.util.LinkedHashSetjava.util.TreeSet

インターフェース実装を設定する

Set インターフェースには、AbstractSetとそのサブクラス、および最終的な静的内部クラス(ここで、 とは正式な型パラメータ) など、複数の実装があります。 ConcurrentHashMap.KeySetView<K,V>KV

抽象セット

AbstractSetインターフェースの骨格となる実装ですSet[ 14 ]

の直接のサブクラスには、、、、が含まれAbstractSetます。 ConcurrentSkipListSetCopyOnWriteArraySetEnumSetHashSetTreeSet

EnumSetクラス

クラスはEnumSetを拡張しますAbstractSetEnumSetクラスにはパブリックコンストラクタはなく、静的ファクトリメソッドのみが含まれます。[ 29 ]

EnumSetには静的ファクトリメソッドが含まれています。[ 30 ]このメソッドは集約メソッドです。[ 29 ]このメソッドは複数のパラメータを受け取り、パラメータの型を考慮して適切な型のインスタンスを返します。[ 29 ] 2018年現在、Java SE8のOpenJDK実装では、クライアントからは見えない2つの実装、およびが使用されています。[ 29 ]が小さな列挙型に対してパフォーマンス上の利点をもたらさなくなった場合は、Javaコレクションライブラリに悪影響を与えることなくライブラリから削除できます。[ 29 ]EnumSet.of()EnumSetRegularEnumSetJumboEnumSetRegularEnumSet

EnumSetは、後述するように、集合の一種であるビットフィールドの良い代替となる。 [ 30 ]

従来、開発者は列挙型の要素を集合に配置する必要がある場合は常に、各定数に異なる2の累乗を割り当てるint enumパターンを使用していました。 [ 30 ]このビット表現により、開発者はビットごとのOR演算を使用できるため、定数を集合(ビットフィールドとも呼ばれます)に組み合わせることができます。このビットフィールド表現により、開発者は集合ベースの演算や、積や和などのビットごとの算術演算を効率的に行うことができます。[ 30 ]

しかし、ビットフィールド表現アプローチには多くの問題があります。ビットフィールドはint enum定数よりも可読性が低くなります。[ 30 ]また、要素がビットフィールドで表現されている場合、すべての要素を反復処理することは不可能です。[ 30 ]

推奨される代替アプローチは、ビットフィールドEnumSetの代わりに int enum を使用することです。[ 30 ]このアプローチでは、を使用して同じ型に属する値のセットを表します。[ 30 ]はインターフェースを実装し、ビット単位の演算を使用する必要がなくなったため、このアプローチはより型安全です。 [ 30 ]さらに、メソッドメソッドなど、オブジェクトのインスタンス化を可能にする静的ファクトリが多数あります。[ 30 ]EnumSetEnumEnumSetSetEnumSet.of()

の導入後EnumSetビットフィールド表現アプローチは時代遅れになったと考えられています。[ 30 ]

HashSetクラス

HashSetハッシュテーブルを使用します。より具体的には、java.util.LinkedHashMapハッシュと要素を保存し、重複を防ぐためにハッシュテーブルを使用します。

LinkedHashSetクラス

このjava.util.LinkedHashSetクラスは、HashSetすべての要素を挿入順序で連結する双方向リンクリストを作成することで拡張されます。これにより、反復処理の順序がSet予測可能になります。

CopyOnWriteArraySetクラス

CopyOnWriteArraySetは、同期された の並行代替ですSet。同期を実行したり、反復中にオブジェクトのコピーを作成する必要がなくなるため、多くの状況で並行性が向上します。これは、 が同期されCopyOnWriteArrayListた の並行代替として機能する方法と似ていますList[ 31 ] 一方、 と同様にCopyOnWriteArrayListCopyOnWriteArraySet同期が必須の場合は を使用しないでください。

SortedSetインターフェース

インターフェースはインターフェースjava.util.SortedSetを拡張しますjava.util.Set。通常の とは異なりSet、 内の要素はSortedSet、要素のcompareTo(T o)メソッド、または のコンストラクタに提供された メソッドによってソートされますSortedSet。 の最初と最後の要素は、それぞれとメソッドSortedSetを使用して取得できます。また、 の最小値と最大値、または の先頭または末尾で開始または終了することによってサブセットを作成できます。クラスはインターフェースを実装します。[ 32 ]first()last()SortedSetjava.util.TreeSetSortedSet

インターフェースは インターフェースjava.util.NavigableSetを拡張しjava.util.SortedSet、いくつかの追加メソッドを備えています。floor(E e)ceiling(E e)lower(E e)higher(E e)メソッドは、集合内でパラメータに近い要素を検索します。さらに、 内の項目に対する降順反復子がSet提供されます。 と同様にSortedSetjava.util.TreeSetは を実装しますNavigableSet[ 33 ]

TreeSetクラス

java.util.TreeSetは、 によって実装された赤黒木を使用しますjava.util.TreeMap。赤黒木は重複がないことを保証します。さらに、TreeSetを実装することができますjava.util.SortedSet[ 34 ]

ConcurrentSkipListSetクラス

ConcurrentSkipListSetsynchronized の実装の並行置換として機能しますSortedSet。例えば、メソッドTreeSetによってラップされた を置き換えますsynchronizedMap[ 35 ]

マップインターフェース

java.util.MapマップはJava のインターフェース によって定義されます。

マップインターフェースの実装

Mapは、キーと要素を関連付けるデータ構造です。これにより、マップは非常に柔軟になります。キーが要素のハッシュコードの場合、マップはMap基本的に ですSet。キーが単に増​​加する数値の場合、マップはリストになります。

Map実装の例としてはjava.util.HashMap、、、java.util.LinkedHashMapなどがありますjava.util.TreeMap

AbstractMapクラス

AbstractMapはスケルトン実装の例である。[ 14 ]

AbstractMapクラスの直接のサブクラスに はConcurrentSkipListMap、、、、、およびEnumMapが含まれます。HashMapIdentityHashMapTreeMapWeakHashMap

列挙マップ

EnumMapは、順序付きインデックス配列と同等の速度を持っています。[ AbstractMap36 ]これ、内部的に配列を使用しており、実装の詳細は開発者から完全に隠されているためです。[ 36 ] したがって、EnumMapは配列の型安全性とパフォーマンス上の利点を兼ね備えています。[ 36 ]EnumMapEnumMapMap

ハッシュマップ

HashMapハッシュテーブルを使用します。キーのハッシュは、様々なバケット内の要素を見つけるために使用されます。はHashMapハッシュベースのコレクションです。[ 37 ]

リンクハッシュマップ

LinkedHashMapは、要素間に双方向リンクリストHashMapを作成することで拡張され、マップに挿入された順序で要素にアクセスできるようになります。には、新しいキーが に追加されるたびにメソッドによって呼び出されるメソッドが含まれています。[ 38 ]は、 true を返すたびに最も古いエントリを削除します。[ 38 ]メソッドはオーバーライドできます。[ 38 ]LinkedHashMapprotectedremoveEldestEntryputMapMapremoveEldestEntryremoveEldestEntry

ツリーマップ

TreeMapHashMapは、やとは対照的にLinkedHashMap、赤黒木を用いる。キーは木内のノードの値として用いられ、ノードは 内の要素を指すMap[ 39 ]

同時ハッシュマップ

ConcurrentHashMapはに似ておりHashMap、ハッシュベースのコレクションでもあります。[ 37 ]しかし、使用するロック戦略の違いなど、いくつかの違いがあります。

ConcurrentHashMapは、スケーラビリティと並行性を向上させるために、全く異なるロック戦略を採用しています。[ 37 ]同じConcurrentHashMapロックを使用するすべてのメソッドを同期させるわけではありません。[ 37 ]代わりに、ロックストライピングConcurrentHashMapと呼ばれるメカニズムを使用します。[ 37 ]このメカニズムは、よりきめ細かいロックメカニズムを提供します。[ 37 ]また、より高度な共有アクセスも許可します。[ 37 ]

ConcurrentSkipListMapクラス

ConcurrentSkipListMapは同期された の実装の並行置換として機能しますSortedMapConcurrentSkipListMapは と非常によく似ておりConcurrentSkipListSet、 はメソッドによってラップされたConcurrentSkipListMapを置き換えます。[ 35 ]TreeMapsynchronizedMap

サブインターフェースをマップする

SortedMapインターフェース

インターフェースはインターフェースjava.util.SortedMapを拡張しますjava.util.Map。このインターフェースは、Map提供されたキーでソートされる を定義します。compareTo()のコンストラクタで提供される メソッドまたは メソッドを再び使用することでSortedMap、キーと要素のペアは キーでソートされます。 の最初と最後のキーは、それぞれ メソッドとメソッドMapを使用して呼び出すことができます。さらに、 メソッドを使用して、最小キーと最大キーからサブマップを作成することができます。は によって実装されています。[ 40 ]firstKey()lastKey()K) subMap(K fromKey, K toKey)SortedMapjava.util.TreeMap

このjava.util.NavigableMapインターフェースはjava.util.SortedMap様々な方法で拡張できます。指定されたキーに最も近いキーまたはマップエントリをどちらの方向でも検索するメソッドを呼び出すことができます。マップを反転することもでき、そこから逆順のイテレータを生成することもできます。これは によって実装されていますjava.util.TreeMap[ 41 ]

ConcurrentMapインターフェース

インタフェースはインタフェースjava.util.concurrent.ConcurrentMapを拡張しますjava.util.Map。このインタフェースはスレッドセーフなインタフェースであり、Javaプログラミング言語のJava Collections FrameworkMapバージョン1.5で導入されました。[ 20 ]

Javaコレクションフレームワークの拡張

JavaコレクションフレームワークはApache Commons Collectionsライブラリによって拡張され、バッグや双方向マップなどのコレクション型や、和集合や積集合を作成するためのユーティリティが追加されています。[ 42 ]

Google は、guava ライブラリの一部として独自のコレクション ライブラリをリリースしました。

参照

引用

  1. ^ 「レッスン:コレクション入門」Oracle Corporation . 2010年12月22日閲覧
  2. ^ a b c Bloch 2018、pp. 126–129、第5章項目28:配列よりもリストを優先する。
  3. ^ a b Horstmann, Cay (2014). Big Java Early Objects .
  4. ^ a b「Java Collections Framework」(PDF) IBM 2011年8月7日時点のオリジナル(PDF)からアーカイブ
  5. ^ Becker, Dan (1998年11月1日). 「Java Collections Framework 入門」 . JavaWorld . 2020年7月13日閲覧。Collectionsが待望のデビューを果たす以前は、Java オブジェクトをグループ化する標準的な方法は、配列、Vector、Hashtable でした。これら3つのコレクションは、メンバーにアクセスするための方法と構文がそれぞれ異なっており、配列は角括弧 ([]) 記号、Vector は elementAt メソッド、Hashtable は メソッドを使用しますgetput
  6. ^ a b Lea, Doug . 「collections パッケージの概要」. 2011年1月1日閲覧. Sun Java Development Kit JDK1.2 には、ついに標準のコレクションクラスセットが含まれています。設計と実装には若干の違いはあるものの、JDK1.2 パッケージには、このパッケージとほぼ同じ基本的な抽象化、構造、機能が含まれています。そのため、このコレクションパッケージは今後更新されません。
  7. ^ 「Generic Collection Library for Java™」2009年3月12日時点のオリジナルよりアーカイブ2011年1月1日閲覧。
  8. ^ Vanhelsuwé, Laurence (1997年6月1日). 「優れた抽象データ構造が必要ですか? ObjectSpaceのJGLは強力です!」 . JavaWorld . 2020年7月13日閲覧。Java自体と同様に、Java Generic LibraryはC++陣営から多くの恩恵を受けています。C++のSTLの優れた部分を取り入れながら、C++の欠点は残しています。今日のC++プログラマーのほとんどはSTLについて知っていますが、その潜在能力を最大限に活用している人はほとんどいません。
  9. ^ Vanhelsuwé, Laurence (1999年1月1日). 「コンテナフレームワークの戦い:どちらを使うべきか?」 . JavaWorld . 2020年7月13日閲覧. ObjectSpace Inc.のJGLとSunのCollections Frameworkを比較するのは、リンゴとキウイフルーツを比べるようなものだ。一見すると、2つのフレームワークは同じ開発者を巡って競合しているように見えるが、よく調べてみると、2つのフレームワークの目標が異なることを認めなければ、公平に比較​​することはできないことが明らかになる。Sunのドキュメントにあるように、CollectionsがSun独自のAPI(コアAPI、拡張機能など)を統一化するのであれば、Collectionsは明らかに素晴らしいニュースであり、熱狂的なJGL愛好家にとっても好ましいものであることは間違いない。Sunがこの分野で約束を破らない限り、私はCollectionsを本格的に導入するためにリソースを投資するつもりだ。
  10. ^ Lea, Doug . 「パッケージ util.concurrent リリース 1.3.4 の概要」. 2011年1月1日閲覧.注: J2SE 5.0 のリリースに伴い、このパッケージはメンテナンスモードに移行します。必須の修正のみがリリースされます。J2SE5 パッケージ java.util.concurrent には、このパッケージの主要コンポーネントの改良版、効率化版、標準化版が含まれています。
  11. ^ Bloch 2018、pp. 87–92、第8章 §8項目8:継承よりもコンポジションを優先する。
  12. ^ "Iterable (Java Platform SE 7)" . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  13. ^ Bloch 2018、pp. 117–122、第5章項目26: 生の型を使用しないでください。
  14. ^ a b c Bloch 2018、pp. 99–103、第4章項目20:抽象クラスよりもインターフェースを優先する。
  15. ^ 「リスト(Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  16. ^ a b Bloch 2018、pp. 87–92、第4章項目18:継承よりもコンポジションを優先する。
  17. ^ a b c Bloch 2018、pp. 317–322、第11章項目79:過度の同期を避ける。
  18. ^ a b Bloch 2018、pp. 280–281、第9章項目64:オブジェクトをインターフェースで参照する。
  19. ^ 「PriorityQueue (Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  20. ^ a b c Goetz et al. 2006、pp. 84–85、§5.2 並行コレクション。
  21. ^ a b c Goetz et al. 2006、pp. 52–53、§3.5.3 安全な出版イディオム。
  22. ^ Bloch 2018、pp. 325–329、第11章項目78:共有された変更可能なデータへのアクセスを同期する。
  23. ^ 「BlockingQueue (Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  24. ^ Bloch 2018、pp. 325–329、第11章項目81:待機と通知よりも並行性ユーティリティを優先する。
  25. ^ a b Goetz et al. 2006、p. 92、§5.3.3 Dequesとワークスティーリング。
  26. ^ 「Deque (Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  27. ^ a b「キュー(Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  28. ^ "BlockingDeque (Java Platform SE 7)" . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  29. ^ a b c d e Bloch 2018、pp. 5–9、第5章 ビットフィールドの代わりにEnumSetを使用します。
  30. ^ a b c d e f g h i j k Bloch 2018、pp. 169–170、第5章 ビットフィールドの代わりにEnumSetを使用します。
  31. ^ゲッツら。 2006、86 ~ 89 ページ、§5.2.3 CopyOnWriteArrayList。
  32. ^ "SortedSet (Java Platform SE 7)" . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  33. ^ "NavigableSet (Java プラットフォーム SE 7)" . Docs.oracle.com。 2013年6月6日。
  34. ^ 「Set (Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  35. ^ a b Goetz et al. 2006、pp.84-85、§5.2 ConcurrentCollections。
  36. ^ a b c Bloch 2018、pp. 171–175、第6章項目36:序数インデックスの代わりにEnumMapを使用します。
  37. ^ a b c d e f g Goetz et al. 2006、pp. 85–86、§5.2.1 ConcurrentHashMap。
  38. ^ a b c Bloch 2018、pp. 199–202、第44章 標準的な機能インターフェースの使用を推奨します。
  39. ^ 「Map (Java Platform SE 7)」 . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  40. ^ "SortedMap (Java Platform SE 7)" . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  41. ^ "NavigableMap (Java Platform SE 7)" . Docs.oracle.com. 2013年6月6日. 2013年8月16日閲覧
  42. ^ 「コレクション - ホーム」 . Commons.apache.org. 2013年7月4日. 2013年8月16日閲覧

参考文献

  • ブロック、ジョシュア(2018年)『Effective Java: プログラミング言語ガイド』(第3版)Addison-Wesley. ISBN 978-0134685991
  • ブライアン・ゲッツ、ティム・パイエルス、ジョシュア・ブロック、ジョセフ・ボウビア、デイビッド・ホームズ、ダグ・リー(2006年)『Java Concurrency in Practice』Addison Wesley、ISBN 0-321-34960-1. OL  25208908M .