今日は、Javaのコレクションについてお話したいと思います。 このトピックは、Java開発者のほぼすべての技術面接で見つかりますが、すべての開発者が標準ライブラリでさえすべてのコレクションを完全にマスターしているわけではありません。もちろん、グアバ、Apache、Troveなどのコレクションの代替実装を持つすべてのライブラリはもちろんです。 Javaの世界で見つけられるコレクションと、それらを操作する方法がどのように存在するかを見てみましょう。

この記事は、初心者にとって(コレクションが何であるか、コレクションをどのように扱うかについての一般的な理解を得るために)、また役に立つコレクションを見つけたり、単に知識を構築したりする経験豊富なプログラマーの両方に役立ちます。 実際、主要なことは、どのプログラミング言語のコレクションについても少なくとも基本的な知識を持っていることです。これは、コレクションが原則として何であるかについての記事には説明がないためです。
I.標準Javaコレクションライブラリ
当然、ほとんどすべての人がすでにJDKのメインコレクションを知っていますが、それらについてはまだ覚えておいてください。標準コレクションに関するすべてを既に知っていることが確実な場合は、ネタバレのすべてを次のセクションに安全にスキップできます。
初心者向けコレクションノート初心者にとって(特に他のプログラミング言語から切り替えた場合)、Javaコレクションに保存されているのはリンク/ポインターのみであり、それ以上のものではないことを理解するのが非常に難しい場合があります。 addまたはputを呼び出すと、オブジェクトは実際にはコレクション内のどこかに格納されているようです。これは、プリミティブ型で動作する配列にのみ当てはまり、リンクのみを格納するコレクションには当てはまりません。 そのため、「ArrayListコレクションの正確なサイズに名前を付けることはできますか?」などのインタビューの質問に対して、初心者は「保存されているオブジェクトの種類に依存する」などの質問に答え始めます。 コレクションはオブジェクト自体を保存せず、オブジェクトへのリンクのみを保存するため、これは完全に間違っています。 たとえば、同じオブジェクトをリストに100万回追加できます(より正確には、1つのオブジェクトに100万のリンクを作成します)。
1)JDKコレクションインターフェイス
JDKコレクションインターフェイス収集インターフェース役職 | 説明 |
---|
反復可能 | コレクションにイテレータがあり、for(Type value:collection)でバイパスできることを意味するインターフェース。 ほとんどすべてのコレクション(マップを除く)
|
収集 | ほとんどのコレクションのメインインターフェイス(マップを除く) |
一覧 | リストは順序付けられたコレクションであり、シーケンスとも呼ばれます。 (シーケンス)。 ほとんどの実装で要素の重複は許可されています。 アクセスを許可します 要素インデックス。 コレクションインターフェイスを拡張します。
|
セット | セットでの作業を実装するインターフェース(数学セットに類似)、複製 アイテムは禁止されています。 注文する場合としない場合があります。 コレクションインターフェイスを拡張します。
|
キュー | キューは、コレクションに対する通常の操作とは異なり、処理前にオブジェクトを保存することを目的としたコレクションです。キューは、追加、受信、表示のための追加メソッドを提供します。 原則として、要素インデックスによるクイックアクセスには含まれません。 コレクションインターフェイスを拡張
|
デケ | 双方向キュー。両端からの要素の追加と削除をサポートします。 展開する キューインターフェイス。
|
地図 | キーと値のマッチングで動作します。 各キーは1つの値にのみ対応します。 で 他のコレクションとは異なり、インターフェイス(CollectionおよびIterableを含む)は拡張されません。
|
ソート済みセット | 自動的にソートされたセット、または自然順(詳細については、 比較可能なインターフェース)、またはComparatorを使用します。 セットインターフェイスを拡張
|
ソート済みマップ | これは、キーが種類ごとまたは使用して自動的にソートされるマップです コンパレータ Mapインターフェースを拡張します。
|
ナビゲーション可能セット
| これは、指定された検索値に最も近い値を見つけるためのメソッドが追加されたSortedSetです。 NavigableSetにアクセスしてバイパスまたは順番に実行できます 値の降順または昇順。
|
ナビ可能マップ
| これはSortedMapであり、特定の検索値に最も近い値を見つけるためのメソッドを追加しました。 降順または 昇順。
|
java.util.concurrentパッケージのインターフェース
役職 | 説明 |
---|
ブロッキングキュー
| キューのサイズ、条件付きロック、受信時のデータの追加時またはデータの不足時のオーバーフローを処理するさまざまなメソッドを設定する機能を含むマルチスレッドキューの実装(例外をスローする、スレッドを永続的または一時的にブロックする、falseを返すなど)
|
TransferQueue
| このマルチスレッドキューは、受信スレッドが要素をキューからプルするまで挿入スレッドをブロックできるため、スレッド間の同期および非同期メッセージ転送の実装に使用できます。
|
Blockingdeque
| BlockingQueueに似ていますが、双方向キュー用です |
コンカレントマップ
| インターフェース、Mapインターフェースを拡張します。 多数の新しいアトミックメソッドを追加します:putIfAbsent、remove、replace。マルチスレッドプログラミングを簡単かつ安全にします。
|
並行ナビゲーション可能マップ
| マルチスレッドバージョン用にNavigableMapインターフェースを拡張 |
java.util.concurrentのインターフェースおよびコレクションに関する詳細情報に興味がある場合は、
こちらの
記事をご覧ください 。
2)すべてのコレクションの非常に簡単な説明を含む表
すべてのコレクションの非常に簡単な説明を含む表種類 | シングルスレッド | マルチスレッド |
---|
リスト |
- ArrayList-配列に基づくメインリスト
- LinkedList-まれなケースでのみ有用です。
- ベクトル-非推奨
| - CopyOnWriteArrayList-まれな更新、頻繁な読み取り
|
キュー/ Deques
| - ArrayDeque-配列に基づくメイン実装
- スタック-非推奨
- PriorityQueue-ソートされたキュー
| - ArrayBlockingQueue-ブロッキングキュー
- ConcurrentLinkedDeque / ConcurrentLinkedQueue-関連ノードのキュー
- DelayQueue-各アイテムの遅延キュー
- LinkedBlockingDeque / LinkedBlockingQueue-関連ノードのブロッキングキュー
- LinkedTransferQueue-要素の転送に使用できます
- PriorityBlockingQueue-マルチスレッドPriorityQueue
- SynchronousQueue-シンプルなマルチスレッドキュー
|
地図
| - HashMap-メインの実装
- EnumMap-キーとして列挙
- ハッシュテーブル-非推奨
- IdentityHashMap-キーは==を使用して比較されます
- LinkedHashMap-広告掲載オーダーを保存します
- TreeMap-各種キー
- WeakHashMap-キャッシュに役立つ弱いリンク
| - ConcurrentHashMap-メインのマルチスレッド実装
- ConcurrentSkipListMap-ソートされたマルチスレッド実装
|
セット
| - HashSetは多くの主要な実装です
- EnumSet-多くの列挙
- BitSet *-多くのビット
- LinkedHashSet-挿入順序を保持
- TreeSet-ソートセット
| - ConcurrentSkipListSet-ソートされたマルチスレッドセット
- CopyOnWriteArraySet-まれな更新、頻繁な読み取り
|
*-実際には、BitSetはSetと呼ばれますが、Setインターフェイスは継承しません。
3)JDKの非推奨のコレクション
非推奨のJavaコレクション廃止(レガシー)と見なされる汎用ユニバーサルコレクション
名 | 説明 |
---|
ハッシュテーブル
| 当初はHashMapの同期アナログとして考えられていましたが、まだ可能ではありませんでした Collecions.synchronizedMapを使用してコレクションのバージョンを取得します。 現時点では、原則として ConcurrentHashMapを使用します。 HashTableは同期よりも遅く、スレッドセーフではありません HashMap。完全なレベルではなく、個々の操作のレベルで同期を提供します。 コレクション。
|
ベクトル | 以前はArrayListの同期バージョンとして使用されていましたが、次の理由と同じ理由で廃止されました ハッシュテーブル
|
スタック | 以前はキューの構築に使用されていましたが、ベクターに基づいて構築されているため、 また、道徳的に時代遅れと見なされます。
|
従来のコレクションに基づいて構築された特殊なコレクション
名 | に基づいて | 説明 |
---|
物性
| ハッシュテーブル | Hashtableに基づいて構築されたデータ構造として、Propertiesはかなり時代遅れの構造です。 文字列を含むマップを使用することをお勧めします。 プロパティの詳細 この議論で推薦されない使用を見つけることができます。
|
UIDefaults
| ハッシュテーブル | Swingコンポーネントのデフォルト設定を保存するコレクション |
4)
リストインターフェイスを実装するコレクション
Listインターフェースを実装するコレクションリストを実装する汎用ユニバーサルコレクション:
役職 | によって設立されました に
| 説明 | サイズ* |
---|
配列リスト
| 一覧 | 動的に変化する配列に基づいたListインターフェイスの実装。 ほとんどの場合、Listインターフェイスの最適な実装は、メモリ消費とパフォーマンスです。 非常にまれなケースで、リストの先頭または中央に非常に小さい文字列を頻繁に挿入する必要がある場合 リスト上の移動回数により、LinkedListはパフォーマンスの向上につながります(ただし、これらの場合は、ApacheのTreeListを使用することをお勧めします)。 詳細が興味深いArrayListである場合、この記事を参照することをお勧めします。
| 4 * N
|
LinkedList
| 一覧 | 双方向リンクリストに基づいたListインターフェイスの実装。つまり、各要素が前の要素と次の要素を指している場合。 原則として、ArrayListよりも多くのメモリとパフォーマンスが必要です。リスト内の最小の移動でリストの中央での挿入/削除が必要になることが多いまれな場合にのみ使用するのが理にかなっています(ただし、これらの場合はApacheからTreeListを使用することをお勧めします。 Dequeインターフェイス。 Queueインターフェイスを介して作業する場合、LinkedListはFIFOキューとして機能します。 LinkedListの詳細に興味がある場合は、この記事を参照することをお勧めします。
| 24 * N
|
java.util.concurrentパッケージのコレクション
役職 | によって設立されました に
| 説明 |
---|
CopyOnWriteArrayList
| 一覧 | ArrayListに似たListインターフェイスの実装ですが、リストが変更されるたびに作成されます コレクション全体の新しいコピー。 これには、コレクションが変更されるたびに非常に大きなリソースが必要です。 ただし、このタイプのコレクションでは、コレクションが 反復時間。
|
リストに基づく高度に専門化されたコレクション。
役職 | に基づいて | 説明 |
---|
役割リスト
| 配列リスト | ロール(ロール)のリストを保存するためのコレクション。 に基づいた高度に専門化されたコレクション いくつかの追加メソッドを持つArrayList
|
RoleUnresolvedList
| 配列リスト | 未解決のロール(未解決のロール)のリストを保存するためのコレクション。 高度に専門化された ArrayListベースのコレクションといくつかの追加メソッド
|
AttributeList
| 配列リスト | MBean属性を格納するためのコレクション。 ArrayListに基づく高度に専門化されたコレクション いくつかの追加の方法で
|
*-サイズは32ビットシステムおよび圧縮Oopsのバイト単位で指定されます。Nはリストの容量です
5)
Setインターフェースを実装するコレクション(多く)
Setインターフェイスを実装するコレクション(多く)役職 | によって設立されました に
| 説明 | サイズ* |
---|
ハッシュセット | セット | ハッシュテーブルを使用したSetインターフェイスの実装。 ほとんどの場合、Setインターフェイスの最適な実装が可能です。
| 32 * S + 4 * C
|
LinkedHashSet
| ハッシュセット | ハッシュテーブルとリンクリストに基づくSetインターフェイスの実装。 HashSetとほぼ同じ速度で動作するアドオンセット。 一般に、HashSetとほぼ同じです。セットに対する反復の順序のみが、要素を追加する順序によって決定されます 初めて設定します。
| 40 * S + 4 * C |
ツリーセット | ナビゲーション可能セット
| 赤黒木を使用したNavigableSetインターフェイスの実装。 コンパレータまたは自然順序を使用してソートされます。つまり、ソート規則に応じて複数のトラバーサル/反復が発生します。 HashMapに基づくHashSetのようなTreeMapに基づく
| 40 * S |
Enumset | セット | ビットベクトルに基づくSetベクトルインターフェイスの高性能実装。 EnumSetオブジェクトのすべての要素は、1つの単一の列挙型に属している必要があります
| S / 8 |
*-サイズは、32ビットシステムおよび圧縮Oopsのバイト単位で指定されます。Cはリストの容量、Sはリストのサイズです
セットに基づく特別なコレクション
役職 | によって設立されました に
| 説明 |
---|
JobStateReasons
| ハッシュセット | 印刷ジョブに関する情報(印刷ジョブの属性セット)を保存するためのコレクション。 いくつかの追加メソッドを備えたHashSetに基づく高度に専門化されたコレクション
|
java.util.concurrentパッケージのコレクション
6)
Mapインターフェイスを実装するコレクション(連想配列)
Mapインターフェースを実装するコレクションMapを実装する汎用汎用コレクション:
役職 | によって設立されました に
| 説明 | サイズ* |
---|
ハッシュマップ | 地図 | ハッシュテーブルを使用したMapインターフェイスの実装(非同期Hashtableとして機能し、 キーとnull値のサポート)。 ほとんどの場合、最高のパフォーマンスと Mapインターフェイスのメモリ実装。 HashMapデバイスの詳細が興味深い場合は、この記事を参照することをお勧めします。
| 32 * S + 4 * C |
LinkedHashMap
| ハッシュマップ | ハッシュテーブルとリンクリスト、つまりマップ内のキーに基づいたMapインターフェイスの実装 追加された順に保存およびバイパスされます。 このコレクションはほぼ同じくらい高速です ハッシュマップ また、キャッシュの作成にも役立ちます( removeEldestEntry(Map.Entry))。 LinkedHashMapデバイスの詳細が興味深い場合は、この記事を参照することをお勧めします。
| 40 * S + 4 * C |
ツリーマップ | ナビ可能マップ
| 赤黒ツリーを使用したNavigableMapの実装、つまりコレクション、キーをトラバースするとき 同じNavigableMapを使用すると、キーに最も近い値を検索できます。
| 40 * S |
弱点マップ
| 地図 | HashMapと同様ですが、すべてのキーは弱いです 弱い参照、つまりガベージコレクションにより、オブジェクトのキーとオブジェクトが削除される可能性があります これらのオブジェクトへの他の参照が存在しない場合の値。 WeakHashMapは最も簡単なものの1つです 弱いリンクを最大限に活用する方法。
| 32 * S + 4 * C |
Enummap | 地図 | 単純な配列に基づいたMapインターフェースの高性能実装。 すべてのキー このコレクションは、1つの列挙型にのみ属することができます。
| 4 * C |
IdentityHashMap
| 地図 | HashMapのようなIDベースのマップはハッシュテーブルに基づいていますが、HashMapとは異なり、 等しいオブジェクトを比較することはありません。実際に同じかどうかのみを比較します メモリ内のオブジェクト。 第一に、コレクションの作業を大幅に高速化し、第二に、 等しいが別のオブジェクトによって意図的に生成される場合の「スプーフィング攻撃」に対する保護。 第三に、このコレクションには、グラフをトラバースするときに多くの用途があります(ディープコピーなど) 1つのオブジェクトを複数回処理することを避ける必要がある場合。
| 8 * C |
*-サイズは32ビットシステムおよび圧縮Oopsのバイト単位で指定されます。Cはリストの容量、Sはリストのサイズです
java.util.concurrentパッケージのコレクション
7)
キュー/デキューインターフェイス (キュー)に基づくコレクション
キュー/デキューベースのコレクション役職 | によって設立されました に
| 説明 | サイズ* |
---|
配列
| デケ | 動的配列に基づくDequeインターフェースの効率的な実装、類似 配列リスト
| 6 * N |
LinkedList
| デケ | 双方向リンクリストに基づくList and Dequeインターフェイスの実装、つまり、各要素が前の要素と次の要素を指す場合、Queueインターフェイスを介して作業する場合、LinkedListはFIFOキューとして機能します。
| 40 * N |
PriorityQueue
| キュー | ヒープ(ヒープ)に基づく無制限の優先度キュー。 ソートされたアイテム わかりましたまたはコンパレータを使用して。 null要素を含めることはできません。
|
*-サイズは、32ビットシステムおよび圧縮Oopsのバイト単位で指定されます。Cはリストの容量、Sはリストのサイズです
java.util.concurrentで定義されているマルチスレッドキューとデックには別の記事が必要なので、ここでは説明しません。これらの情報に興味がある場合は、この
記事を読むことをお勧めします。
8)その他のコレクション
その他のコレクション役職 | 説明 | サイズ* |
---|
ビットセット
| その名前にもかかわらず、BitSetはSetインターフェイスを実装しません。 BitSetは、ビット配列のコンパクトな記録に使用されます。
| N / 8
|
9)コレクションを操作する方法
コレクションメソッドアルゴリズム-コレクションクラスには、多くの便利な統計手法が含まれています。
コレクションを操作するには:方法 | 説明 |
---|
頻度 (コレクション、オブジェクト)
| 指定されたコレクション内のこの要素の出現回数を返します。 |
disjoint (コレクション、コレクション) | 2つのコレクションに共通の要素がない場合、trueを返します。 |
addAll (コレクション<?スーパーT>、T ...) | 指定された配列(またはパラメーターにリストされている)のすべての要素を指定されたコレクションに追加します |
min (コレクション) | コレクションから最小アイテムを返します |
max (コレクション) | コレクションから最大のアイテムを返します |
リストを使用するには:方法 | 説明 |
---|
ソート (リスト) | ほとんどの場合、パフォーマンスが高品質のクイックソートのパフォーマンスに近いマージソートアルゴリズムを使用したソートにより、O(n * log n)パフォーマンス(クイックソートではなく)と安定性(クイックソート)。 安定したソートは、ソート時に同じ要素の順序を変更しないものです |
binarySearch (リスト、オブジェクト) | バイナリ検索アルゴリズムを使用して、リスト内のアイテムを検索します。 |
リバース (リスト) | すべてのリストアイテムを並べ替える |
シャッフル (リスト) | リスト内のすべてのアイテムをランダムにシャッフルします |
fill (リスト、オブジェクト) | リスト内の各アイテムを値で上書きする |
コピー (リスト送信先、リスト送信元) | あるリストを別のリストにコピーする |
回転 (リストリスト、int距離) | リスト内のすべてのアイテムを指定された距離だけ移動します。 |
replaceAll (リストリスト、オブジェクトoldVal、オブジェクトnewVal) | ある値のすべての出現を別の値に置き換えます |
indexOfSubList (リストソース、リストターゲット) | ソースリストでターゲットリストが最初に現れるインデックスを返します |
lastIndexOfSubList (リストソース、リストターゲット) | ソースリスト内のターゲットリストの最後の出現のインデックスを返します |
スワップ (リスト、int、int) | 指定された位置にある要素を交換します |
Java 8では、ストリームApiなどのコレクションを操作する方法も導入されましたが、その使用例についてはセクション5で後述します。
10)さまざまなタイプのJDKコレクションは内部でどのように配置されますか
さまざまなタイプのJDKコレクションは内部でどのように配置されますか収集 | 内部デバイスの説明 |
---|
配列リスト | このコレクションは、配列の設定+リストのサイズを格納する変数です。 中だけ 新しい要素を追加する場所がないたびに再作成される配列。 で コレクション内の要素を追加または削除する場合、メモリ全体でテール全体がシフトされます 新しい場所。 幸いなことに、容量を増やしながら、または追加/削除するときにアレイをコピーします 高速なネイティブ/システムメソッドによって生成される要素。 詳細が興味深い場合 この記事をご覧になることをお勧めします。
|
LinkedList | コレクション内では、前の要素へのリンクを含む内部Nodeクラスが使用され、 次の要素と要素自体の値。 コレクションインスタンス自体にサイズとリンクが格納されます コレクションの最初と最後の要素。 オブジェクトを作成することは、 パフォーマンスとメモリを集中的に使用するLinkedList アナログよりもはるかに多くのメモリ。 通常、ArrayList、ArrayDequeryはパフォーマンスとメモリの最適なソリューションですが、まれなケース(リストの中央に頻繁に挿入され、リスト内のまれな動きが発生する)が役立つ場合があります(ただし、この場合はapacheからTreeListを使用する方が便利です)。 詳細が興味深い場合は、この記事をご覧になることをお勧めします。
|
ハッシュマップ | このコレクションは、ハッシュテーブル上に構築されます。つまり、コレクション内には、コレクションの容量に等しい内部クラス(バケット)ノードの配列があります。 新しい要素を追加すると、そのハッシュ関数が計算され、キャパシティHashMapモジュロで除算されるため、配列内の要素の位置が計算されます。 この場所に要素がまだ保存されていない場合、追加された要素へのリンクを含む新しいNodeオブジェクトが作成され、配列内の目的の場所に書き込まれます。 この場所に既に要素が存在する場合(ハッシュ衝突が発生する場合)、Nodeは基本的に単純にリンクされたリストです。つまり、次の要素へのリンクが含まれます。リスト内のすべての要素をバイパスし、追加された要素と等しいかどうかを確認できますそのような一致が見つからなかった場合、新しいNodeオブジェクトが作成され、リストの最後に追加されます。 リンクリスト(バケット)の要素の数が8個を超える要素になると、代わりにバイナリツリーが作成されます。 ハッシュテーブルの詳細については、 wikiを参照してください(HashMapはチェーンメソッドを使用して衝突を解決します)。 HashMapデバイスの詳細が興味深い場合は、この記事を参照することをお勧めします。
|
ハッシュセット | HashSetは単なるHashMapであり、値の代わりに偽のオブジェクトが書き込まれ、キーのみが重要です。 HashSet内には、HashMapコレクションが常に保存されます。
|
IdentityHashMap | IdentityHashMapはHashMapに類似していますが、要素が等しいかどうかをチェックする必要がないため、 2つの要素の違い。 異なるオブジェクトを指します。 これのおかげで、 内部クラスNodeを取り除き、すべてのデータを1つの配列に格納し、衝突が発生する 適切な空きセルが見つかるまで検索されます( メソッド オープンアドレッシング )ハッシュテーブルの詳細については、 wikiを参照してください (IdentityHashMapはオープンアドレッシングメソッドを使用して衝突を解決します)
|
LinkedHashMap / LinkedHashSet | 内部構造はHashMapとほぼ同じですが、代わりに 内部クラスNode、TreeNodeを使用します。TreeNodeは前の値と次の値を知っています。 これにより、キーを追加する順序でLinkedHashMapをバイパスできます。 基本的にLinkedHashMap = HashMap + LinkedList。 LinkedHashMapデバイスの詳細に興味がある場合は、この記事を参照することをお勧めします。
|
TreeMap / TreeSet | これらのコレクションの内部構造は、バランスの取れた赤黒のツリー上に構築され、 wikiで詳細を読む
|
弱点マップ | 内部では、通常のリンクではなく、すべてがHashMapのように整理されています WeakReferenceが使用され、削除に必要な別のReferenceQueueキューがあります 弱いエントリ
|
EnumSet / EnumMap | EnumSetとEnumMapは、HashSetやHashMapとは異なり、ビットベクトルと配列を使用して データストレージをコンパクトにし、パフォーマンスを向上させます。 これらのコレクションの制限は EnumSetとEnumMapは、1つのEnumの値のみをキーとして保存できます。
|
11)標準コレクションライブラリの他の有用なエンティティ
標準コレクションライブラリの他の有用なエンティティ公式のコレクションガイドに含まれる他の有用なエンティティを見てみましょう
。1)
ラッパー実装 -機能を追加し、他の実装の動作を変更するためのラッパー。 統計的手法のみを使用してアクセスします。
- Collections.unmodifiableInterface-指定されたコレクションに基づいて変更不可能なコレクションを作成するためのラッパー。このコレクションを変更しようとするとUnsupportedOperationExceptionがスローされます
- Collections.synchronizedInterface-指定に基づいて同期コレクションを作成します。ベースコレクションへのアクセスがこの関数によって返されるコレクションラッパーを介している限り、スレッドセーフが保証されます。
- Collections.checkedInterface-型チェック付きのコレクションを動的に返します
(実行時)、つまり、指定されたコレクションのタイプセーフビューを返します。
間違った型の要素を追加しようとすると、ClassCastExceptionがスローされます。 使用する場合
汎用JDKメカニズムは、コンパイルレベルで型のコンパイルをチェックしますが、このメカニズム
バイパスすることができ、動的な型チェックではこの機会を利用できません。
2)
アダプタの実装 -この実装は、1つのコレクションインターフェイスを別のコレクションインターフェイスに適合させます
- newSetFromMap(Map)-Setインターフェースの実装からMapインターフェースの実装を作成します。
- asLifoQueue(Deque)-Dequeからのビューを、Last In First Out(LIFO)の原理に基づいたキューとして返します。
3)
便利な実装 -コレクションインターフェイスの高性能な「ミニ実装」。
- Arrays.asList-配列をリストとして表示できます
- emptySet、emptyList、およびemptyMap-空のセット、リスト、または空の未変更の実装を返します。
地図
- singleton、singletonList、singletonMap -1つの指定されたオブジェクト(または1つのキーと値の関係)を含む変更不可能なセット、リスト、またはマップを返します
- nCopies-指定されたオブジェクトのn個のコピーを含む変更不可能なリストを返します
4)
インターフェイスの抽象的な実装 -コレクションの特定の実装の作成を簡素化するための共通機能(コレクションのスケルトン)の実装。
- AbstractCollection-セットでもリストでもないコレクション(「バッグ」やマルチセットなど)のCollectionインターフェイスの抽象実装。
- AbstractSet -Setインターフェイスの抽象的な実装。
- AbstractList-配列などのランダムアクセスを許可するリストのListインターフェイスの抽象的な実装。
- AbstractSequentialList-リンクリストなどのシーケンシャルアクセスベースのリスト用のListインターフェイスの抽象的な実装。
- AbstractQueue-抽象キューの実装。
- AbstractMap-抽象マップの実装。
4)
インフラ- イテレータ -通常の列挙インターフェイスに似ていますが、優れた機能を備えています。
- Iterator -Enumerationインターフェイス機能に加えて、コレクションからアイテムを削除する機能が含まれます。
- ListIteratorはリストに使用されるイテレーターで、双方向の反復、要素の置換、要素の挿入、インデックスによる取得など、通常のイテレーターインターフェイスの機能を追加します。
5)注文
- 比較可能 -それらを実装するクラスの自然なソート順を定義します。 この順序は、ソート方法で使用するか、ソートされたセットまたはマップを実装するために使用できます。
- Comparator-順序関係を表します。これは、ソートされたセットまたはマップ内のリストまたはメイン順序をソートするために使用できます。 型の自然な順序をオーバーライドしたり、Comparableインターフェイスを実装していない型のオブジェクトを順序付けたりできます。
6)ランタイム例外
- UnsupportedOperationException-このエラーは、コレクションが呼び出された操作をサポートしていない場合にスローされます。
- ConcurrentModificationException-イテレータまたはリストイテレータをスローします。イテレータが基づいているコレクションが(アルゴリズムの場合)反復中に予期せず変更された場合、メインリストが予期せず変更された場合はリストに基づいたビューもスローします
7)パフォーマンス
- RandomAccess-リストをマークするマーカーインターフェイスは、位置によって要素にすばやく(通常は一定時間)アクセスできるようにします。 これにより、シーケンシャルアクセスと位置アクセスの選択に関するこの動作を考慮したアルゴリズムを生成できます。
8)配列を操作するためのユーティリティ
- 配列 -配列のハッシュをソート、検索、比較、サイズ変更、取得するための静的メソッドのセット。 また、配列を文字列に変換し、配列をプリミティブまたはオブジェクトで埋めるためのメソッドも含まれています。
II。 サードパーティのコレクションライブラリの概要
したがって、次のサードパーティライブラリを確認したいと思います:guava、apache、trove、gs-collections。 なぜこれらのライブラリーなのか? GuavaとApache Commonsコレクションは非常に人気があり、ほとんどすべてのJavaプロジェクトで出会いました。Troveは、メモリを削減し、コレクションを操作するパフォーマンスを向上させる必要があるときに非常に人気のあるライブラリです。 GSコレクション-github'eで非常に人気のあるライブラリ(1300以上の星)の見積もりから判断すると、グアバだけがそれよりも多くの「星」を獲得しました。 他のいくつかの人気のあるライブラリを垣間見るだけです。
したがって、まず最初に、さまざまなライブラリが提供する主な機能を考慮してください(警告:これは非常に主観的です。一部の人々にとって、主な機能は完全に異なるライブラリ機能になります)。
2.1さまざまなコレクションライブラリのチップ
さまざまなコレクションライブラリの主な機能(私の意見では)を簡単に確認しましょう。
1)
グアバ-Googleのこのコレクションは、標準のコレクションフレームワークに次いでほぼ最も人気があります。
いくつかの興味深いコレクションを追加しますが、最も重要な「トリック」は、静的なユーティリティクラスの豊富なセットです。
コレクションの機能を拡張して、新しいタイプのコレクションよりも標準コレクションで機能するメソッド。
実際には、標準のコレクションは置き換えられません。
2)
Apache Commons Collections-このコレクションは、グアバに最も近い「競合他社」であり、多くの
興味深いコレクション、標準Javaコレクションを操作するためのユーティリティ、および多数のラッパー
コレクションの動作の変更。 さらに、よりシンプルなメカニズムでマップの実装を提供します。
それを繰り返します。
3)
Trove-このコレクションの機能は、主にパフォーマンスとメモリの削減にあるため、
標準コレクションの高速な実装(および必要なメモリが少ない)とコレクションを提供します
プリミティブ型。
4)
GSコレクション -このコレクションの特徴は、ソートやクラスなどの処理方法を組み合わせることです。
ユーティリティクラスの静的メソッドを使用するための代替を作成するコレクション。 このライブラリは代替品を提供します
ほとんどすべての標準コレクションといくつかの新しいコレクションが追加されます。
III。 異なるライブラリの代替タイプのコレクション
ここでは、さまざまなライブラリでどのような新しい興味深いコレクションが見つかるかを簡単に考えてみます。
3.1グアバの代替収集タイプ
公式情報: ドキュメント 、
ソースコード 、
javadocプロジェクトへの接続方法:
メイヴン、グラドルメイヴン
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>
グラドル
dependencies { compile 'com.google.guava:guava:18.0' }
Googleは、既存のコレクションにいくつかの興味深い追加機能を開発しました。これらの機能は、できれば非常に便利です。
プロジェクトでguavaライブラリを使用します。 これらのコレクションは、長い間事実上の標準になっていると言えます。
ほとんどのJavaプロジェクトでは、経験豊富な開発者にとっては、何らかの理由でプロジェクトを知ることが重要です。
理由は彼らのプロジェクトでそれらを使用することはできません、多くの場合、インタビューでグアバについての質問を聞くことができます
コレクション。
それらをさらに詳しく見てみましょう。 まず、グアバのメインコレクションとクラスグループのインターフェイスを見てみましょう。
注意 :テーブルが全体に収まらない場合は、ページをズームアウトするか、別のブラウザーで開いてみてください。
3.2 Apache Commonsコレクションからの新しいタイプのコレクション
公式情報 :
ドキュメント 、
ソースコード 、
ユーザードキュメント 、
javadocプロジェクトへの接続方法:
メイヴン、グラドル、アイビーメイヴン
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency>
グラドル
'org.apache.commons:commons-collections4:4.0'
ツタ
<dependency org="org.apache.commons" name="commons-collections4" rev="4.0"/>
注意 :テーブルが全体に収まらない場合は、ページをズームアウトするか、別のブラウザーで開いてみてください。
3.3 Troveコレクション
代替コレクションの他のライブラリとは異なり、Troveは新しい独自のビューを提供しません。
コレクションが、既存の最適化を提供します:
まず、ご存じのように、プリミティブJava型は標準コレクションに追加できず、ラッパーのみが追加されます。これは劇的です
占有メモリが増加し、コレクションのパフォーマンスがわずかに低下します。 Troveはコレクションのコレクションを提供し、
プリミティブ型を含むキーと値。
第二に、標準コレクションはメモリ消費に最適な方法で実装されないことがよくあります。たとえば、各HashMap要素は個別のオブジェクトに格納され、HashSetはキーの代わりに偽のオブジェクトを格納するHashMapです。 Troveは、配列とオープンアドレッシングに基づいてこのようなコレクションの実装を提供します。これにより、必要なメモリが大幅に削減され、場合によってはパフォーマンスが向上します。
更新:コメントでは、すべての点(バグの数、インターフェイスの完全なカバレッジ、パフォーマンス、サポートアクティビティなど)でfastutilまたはGSに劣るので、新しいプロジェクトでTroveを使用することは悪いと記事は示唆しています。 残念ながら、現在TroveとfastutilおよびGSの完全な分析/比較を行う機会がないため、この意見を確認することはできません。代替コレクションのライブラリを選択する際に検討してください。
公式情報: ドキュメント 、
ソースコード 、
javadocプロジェクトへの接続方法:
メイヴン、グラドル、アイビーメイヴン
<dependency> <groupId>net.sf.trove4j</groupId> <artifactId>trove4j</artifactId> <version>3.0.3</version> </dependency>
グラドル
'net.sf.trove4j:trove4j:3.0.3'
ツタ
<dependency org="net.sf.trove4j" name="trove4j" rev="3.0.3"/>
3.4 GSコレクションのコレクション
このライブラリの主な機能は、コレクションの処理(並べ替え、検索)のメソッドがコレクションクラス自体に追加されず、Collections.sortなどが使用されることは非論理的で見苦しいことです。 したがって、GSコレクションは、すべての処理、検索、およびソートのメソッドを格納する「リッチコレクション」のアイデアを提案しました。つまり、Collections.sort(リスト)の代わりに、list.sortのみが呼び出されます。 そのため、ライブラリは、標準コレクションの類似物に加えて、いくつかの新しいコレクションを提供しています。
公式情報 :
ドキュメント 、
ソースコード 、
ユーザードキュメント 、
javadocプロジェクトへの接続方法:
メイヴン、グラドル、アイビーメイヴン <dependency> <groupId>com.goldmansachs</groupId> <artifactId>gs-collections-api</artifactId> <version>6.2.0</version> </dependency> <dependency> <groupId>com.goldmansachs</groupId> <artifactId>gs-collections</artifactId> <version>6.2.0</version> </dependency> <dependency> <groupId>com.goldmansachs</groupId> <artifactId>gs-collections-testutils</artifactId> <version>6.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>com.goldmansachs</groupId> <artifactId>gs-collections-forkjoin</artifactId> <version>6.2.0</version> </dependency>
グラドル compile 'com.goldmansachs:gs-collections-api:6.2.0' compile 'com.goldmansachs:gs-collections:6.2.0' testCompile 'com.goldmansachs:gs-collections-testutils:6.2.0' compile 'com.goldmansachs:gs-collections-forkjoin:6.2.0'
ツタ <dependency org="com.goldmansachs" name="gs-collections-api" rev="6.2.0" /> <dependency org="com.goldmansachs" name="gs-collections" rev="6.2.0" /> <dependency org="com.goldmansachs" name="gs-collections-testutils" rev="6.2.0" /> <dependency org="com.goldmansachs" name="gs-collections-forkjoin" rev="6.2.0"/>
3.5 Fastutilコレクション
プリミティブ型のコレクションを扱うためのこのライブラリを非常に簡単に見てみましょう。
詳細は、
ドキュメント 、
ソースコード 、
javadocを参照してください。役職 | 説明 |
---|
Byte2DoubleOpenHashMap、 IntArrayList、 IntArrayPriorityQueue など
| さまざまなプリミティブ型のコレクション、命名原則[Type] ArrayList、[Type] ArrayPriorityQueueなど。 リストまたはセット、および[KeyType] 2 [ValueType] OpenHashMapなど。 マップ用。 |
IntBigList、 DoubleOpenHashBigSetなど | 非常に大きなサイズのさまざまなプリミティブタイプのコレクション。これらのコレクションでは、intではなく長い要素を使用できます。 内部では、データは通常配列の配列として保存されます。 パフォーマンスの損失は約30%に達する可能性があるため、通常のコレクションで十分な場合はそのようなコレクションを使用することはお勧めしませんが、このようなコレクションを使用すると、大量のデータを操作できます |
3.6他のコレクションライブラリとプリミティブコレクションのパフォーマンスについて少し
TroveとFastutilに加えて、プリミティブ型のコレクションと標準コレクションの高速アナログを実装するいくつかの有名なライブラリがあります。
1)
HPPC -Java用の高性能プリミティブコレクションは、JDKのコレクションに類似したプリミティブコレクションも提供します。
2)
Koloboke (HFTCの別名)-名前が
示すように、このプリミティブ型のライブラリは、
OpenHFTプロジェクトの一環としてロシアのプログラマー(Roman Leventov)によって開発されました。 このライブラリは、高性能なプリミティブコレクションの実装にも役立ちます。
さまざまなライブラリのパフォーマンスを比較することが興味深い場合は、この
記事を参照することをお勧めします。特定の条件でテストされたのはHashMapコレクションのみであることを考慮する必要があります。 さらに、占有メモリを考慮せずに作業速度のみを測定しました(たとえば、HashMap jdkはtroveのアナログよりもはるかに多くのメモリを使用できます)。また、メモリはパフォーマンスよりもさらに重要になる場合があります。
更新:コメントでは、すべての点(バグの数、インターフェイスの完全なカバレッジ、パフォーマンス、サポートアクティビティなど)でfastutilまたはGSに劣るので、新しいプロジェクトでTroveを使用することは悪いと記事は示唆しています。 残念ながら、現在TroveとfastutilおよびGSの完全な分析/比較を行う機会がないため、この意見を確認することはできません。代替コレクションのライブラリを選択する際に検討してください。
IV。 さまざまなライブラリで最も人気のある代替コレクションの実装の比較
4.1グアバ、Apache Commons Collections、GSライブラリでのマルチセット(MultiSet / Bag)の実装
コレクション
したがって、マルチセットは、セット内の要素の存在だけでなく、数も保持するセットです
その中の発生。 JDKでは、Mapコンストラクトでエミュレートできます
<T、Integer>、しかし自然に特殊化されたコレクションを使用すると、使用するコードを大幅に減らすことができます。 比較する
このコレクションのどの実装がさまざまなライブラリを提供していますか:
注意 :テーブルが全体に収まらない場合は、ページをズームアウトするか、別のブラウザーで開いてみてください。
マルチセット(MultiSet / Bag)を使用してテキスト内の単語をカウントする例
タスクがあります :「Hello World! みなさんこんにちは! Hi World!」、それを個別に解析する必要があります
区切り記号がスペースのみの単語。コレクションに保存し、それぞれの出現回数を表示します
単語、テキスト内の単語の合計数、一意の単語の数。
でそれを行う方法を見てみましょう
1.異なるGuisマルチセットオプション:
グアバのHashMultisetを使用して単語をカウントするSystem.out.println(multiset)および
System.out.println(multiset.elementSet())-任意、つまり定義されていません。
グアバのTreeMultisetを使用して単語をカウントするSystem.out.println(multiset)および
System.out.println(multiset.elementSet())-自然、つまり単語はアルファベット順にソートされます。
LinkedHashMultisetTest guavaSystem.out.println(multiset)およびSystem.out.println(multiset.elementSet())の出力順序は、要素が最初に追加された順序であることに注意してください。
ConcurrentHashMultiset guava, System.out.println(multiset)
System.out.println(multiset.elementSet()) — , ,
HashMultiset
2. Bag Apache Commons Collections:
HashBag Apache Commons Collections, System.out.println(multiset)
System.out.println(multiset.elementSet()) — , .
TreeBag Apache Commons Collections, System.out.println(multiset)
System.out.println(multiset.elementSet()) — , .
SynchronizedBag Apache Commons Collections, System.out.println(multiset)
System.out.println(multiset.elementSet()) — , ,
HashBag
SynchronizedSortedBag Apache Commons Collections, System.out.println(multiset)
System.out.println(multiset.elementSet()) — , ,
SortedBag
3. Bag GS Collections:
MutableBag GS Collections, System.out.println(bag) System.out.println(bag.toSet()) —
MutableSortedBag GS Collections, System.out.println(bag) System.out.println(bag.toSortedSet()) — , ..
4. , JDK multiSet HashMap
4.2 Multimap guava, Apache Commons Collections GS Collections
, Multimap map, .
.
, — ,
— , JDK
JDK .
: , .
|
| - -
|
| -
| Guava | アパッチ Commons Collections
| GS Collections
| JDK |
---|
| -
| | HashMap | ArrayList | ArrayList- Multimap
| MultiValueMap | FastList- Multimap
| HashMap<K, ArrayList<V>> |
| | いや | HashMap | HashSet | HashMultimap | MultiValueMap. multiValueMap( new HashMap<K, Set>(), HashSet.class);
| UnifiedSet- Multimap
| HashMap<K, HashSet<V>> |
| -
| いや | HashMap | TreeSet | Multimaps. newMultimap( HashMap, Supplier <TreeSet>)
| MultiValueMap. multiValueMap( new HashMap<K, Set>(), TreeSet.class);
| TreeSortedSet- Multimap
| HashMap<K, TreeSet<V>> |
-
| -
| | Linked HashMap
| ArrayList | LinkedList- Multimap
| MultiValueMap. multiValueMap(new LinkedHashMap<K, List>(), ArrayList.class);
| | LinkedHashMap< K, ArrayList<V>> |
-
| -
| いや | LinkedHash- Multimap
| Linked- HashSet
| LinkedHash- Multimap
| MultiValueMap. multiValueMap(new LinkedHashMap<K, Set>(), LinkedHashSet.class);
| | LinkedHashMap<K, LinkedHashSet<V>> |
-
| -
| いや | TreeMap | TreeSet | TreeMultimap | MultiValueMap. multiValueMap( new TreeMap<K, Set>(),TreeSet.class);
| | TreeMap<K, TreeSet<V>> |
, Apache Commons Collections ,
. guava ,
map' . GS Collections
multimap Bag (HashBagMultimap), . multiset multimap.
Multimap
: «Hello World! Hello All! Hi World!»,
,
, Hello ..
1. Multimap Guava:
HashMultimap guava, , (
HashMap, HashSet). .
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
ArrayListMultimapTest guava, ,
( HashMap, ArrayList).
.
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
LinkedHashMultimapTest guava, (
LinkedHashMap, LinkedHashSet).
.
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
LinkedListMultimapTest guava, (
LinkedHashMap, LinkedList).
.
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
TreeMultimapTest guava, (
TreeMap, TreeSet).
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
2. MultiValueMap Apache Commons Collections:
MultiValueMap Apache Commons Collections, ( HashMap
ArrayList )
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
MultiValueMap, TreeMap<String, TreeSet>(),
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
MultiValueMap, LinkedHashMap<String, LinkedHashSet>(),
String INPUT_TEXT = "Hello World! Hello All! Hi World!";
3. Multimap GS Collections:
FastListMultimap String INPUT_TEXT = "Hello World! Hello All! Hi World!";
HashBagMultimap String INPUT_TEXT = "Hello World! Hello All! Hi World!";
TreeSortedSetMultimap String INPUT_TEXT = "Hello World! Hello All! Hi World!";
4. , JDK multiMap HashMap
multiMap HashMap final int LIST_INDEXES_CAPACITY = 50; String INPUT_TEXT = "Hello World! Hello All! Hi World!";
4.3 BiMap guava, Apache Commons Collections GS Collections
BiMap , HashBiMap guava GS Collections
BidiMap Apache Commons Collections. HashBiMap, guava Enum
, EnumHashBiMap EnumBiMap, Apache Commons Collections
, .
BiMap - «»,
: ,
- , .
1. BiMap Guava:
BiMap guava String[] englishWords = {"one", "two", "three","ball","snow"}; String[] russianWords = {"", "", "","","c"};
EnumBiMap guava enum ENGLISH_WORD { ONE, TWO, THREE, BALL, SNOW } enum POLISH_WORD { JEDEN, DWA, TRZY, KULA, SNIEG }
EnumHashBiMap guava enum ENGLISH_WORD { ONE, TWO, THREE, BALL, SNOW }
2. C BidiMap Apache Commons Collections:
DualHashBidiMap Apache Commons Collections String[] englishWords = {"one", "two", "three","ball","snow"}; String[] russianWords = {"", "", "","","c"};
3. C HashBiMap GS Collections:
HashBiMap GS Collections String[] englishWords = {"one", "two", "three","ball","snow"}; String[] russianWords = {"", "", "","","c"};
4. , JDK
HashMap BiMap String[] englishWords = {"one", "two", "three","ball","snow"}; String[] russianWords = {"", "", "","","c"};
V.
, JDK. , , ( ), , .
5.1 .
Guava gs-collections new, jdk.
5.1.1) (List)
役職 | JDK | guava | gs-collections |
---|
| new ArrayList<>() | Lists.newArrayList() | FastList.newList() |
| Arrays.asList(«1», «2», «3») | Lists.newArrayList(«1», «2», «3») | FastList.newListWith(«1», «2», «3») |
capacity | new ArrayList<>(100) | Lists.newArrayListWithCapacity(100) | FastList.newList(100) |
| new ArrayList<>(collection) | Lists.newArrayList(collection) | FastList.newList(collection) |
Iterable | - | Lists.newArrayList(iterable) | FastList.newList(iterable) |
Iterator' | - | Lists.newArrayList(iterator) | - |
| Arrays.asList(array) | Lists.newArrayList(array) | FastList.newListWith(array) |
c | - | - | FastList.newWithNValues(10, () -> «1») |
5.1.2) (set)
役職 | JDK | guava | gs-collections |
---|
| new HashSet<>() | Sets.newHashSet() | UnifiedSet.newSet() |
| new HashSet<>(Arrays.asList(«alpha», «beta», «gamma»)) | Sets.newHashSet(«alpha», «beta», «gamma») | UnifiedSet.newSetWith(«alpha», «beta», «gamma») |
| new HashSet<>(collection) | Sets.newHashSet(collection) | UnifiedSet.newSet(collection) |
Iterable | - | Sets.newHashSet(iterable) | UnifiedSet.newSet(iterable) |
Iterator' | - | Sets.newHashSet(iterator); | - |
| new HashSet<>(Arrays.asList(array)) | Sets.newHashSet(array) | UnifiedSet.newSetWith(array) |
5.1.3) Map
役職 | JDK | guava | gs-collections |
---|
map' | new HashMap<>() | Maps.newHashMap() | UnifiedMap.newMap() |
map' c capacity | new HashMap<>(130) | Maps.newHashMapWithExpectedSize(100) | UnifiedMap.newMap(130) |
map' map' | new HashMap<>(map) | Maps.newHashMap(map) | UnifiedMap.newMap(map) |
map' | - | - | UnifiedMap.newWithKeysValues(«1», «a», «2», «b») |
map//
Map<String, String> emptyGuava = Maps.newHashMap(); // c guava
Map<String, String> emptyJDK = new HashMap<>(); // JDK
Map<String, String> emptyGS = UnifiedMap.newMap(); // c gs
// map' 100 ( 100)
Map<String, String> approx100 = Maps.newHashMapWithExpectedSize(100); // c guava
Map<String, String> approx100JDK = new HashMap<>(130); // JDK
Map<String, String> approx100GS = UnifiedMap.newMap(130); // c gs
// map' map'
Map<String, String> map = new HashMap<>(3);
map.put(«k1»,«v1»);
map.put(«k2»,«v2»);
Map<String, String> withMap = Maps.newHashMap(map); // c guava
Map<String, String> withMapJDK = new HashMap<>(map); // JDK
Map<String, String> withMapGS = UnifiedMap.newMap(map); // c gs
System.out.println(withMap);
System.out.println(withMapJDK);
System.out.println(withMapGS);
// map'
Map<String, String> withKeys = UnifiedMap.newWithKeysValues(«1», «a», «2», «b»);
System.out.println(withKeys);
5.2 .
役職 | JDK | guava | apache | gs-collections |
---|
| Collections.frequency(collection, «1») | Iterables.frequency(iterable, «1») | CollectionUtils.cardinality(«1», iterable) | mutableCollection.count((each) -> «a1».equals(each)) |
| collection.stream().findFirst().orElse(«1») | Iterables.getFirst(iterable, «1») | CollectionUtils.get(iterable, 0) | orderedIterable.getFirst() |
| collection.stream().skip(collection.size()-1).findFirst().orElse(«1»); | Iterables.getLast(iterable, «1») | CollectionUtils.get(collection, collection.size()-1) | orderedIterable.getLast() |
| Collections.max(collection) | Ordering.natural().max(iterable) | - | orderedIterable.max() |
| Collections.min(collection) | Ordering.natural().min(iterable) | - | orderedIterable.min() |
| | Iterables.getOnlyElement(iterable) | CollectionUtils.extractSingleton(collection) | |
| Collections.binarySearch(list, «13») | Ordering.natural().binarySearch(list, «13») | | mutableList.binarySearch(«13») |
| collection.stream().filter(«13»::equals).findFirst().get() | Iterables.find(iterable, «13»::equals) | CollectionUtils.find(iterable, «13»::equals) | mutableList.select(«13»::equals).get(0) |
| collection.stream().filter((s) -> s.contains(«1»)).collect(Collectors.toList()) | Iterables.filter(iterable, (s) -> s.contains(«1»)) | CollectionUtils.select(iterable, (s) -> s.contains(«1»)) | mutableCollection.select((s) -> s.contains(«1»)) |
, : collection — Collection, iterable — Iterable, list — List, orderedIterable mutableList GS (orderedIterable — , mutableList — )
:
1) Collection<String> collection = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> iterable = collection; MutableCollection<String> collectionGS = FastList.newListWith("a1", "a2", "a3", "a1");
2) Collection<String> collection = Lists.newArrayList("a1", "a2", "a3", "a1"); OrderedIterable<String> orderedIterable = FastList.newListWith("a1", "a2", "a3", "a1"); Iterable<String> iterable = collection;
3) Collection<String> collection = Lists.newArrayList("a1", "a2", "a3", "a8"); OrderedIterable<String> orderedIterable = FastList.newListWith("a1", "a2", "a3", "a8"); Iterable<String> iterable = collection;
4) Collection<String> collection = Lists.newArrayList("5", "1", "3", "8", "4"); OrderedIterable<String> orderedIterable = FastList.newListWith("5", "1", "3", "8", "4"); Iterable<String> iterable = collection;
5) Collection<String> collection = Lists.newArrayList("5", "1", "3", "8", "4"); OrderedIterable<String> orderedIterable = FastList.newListWith("5", "1", "3", "8", "4"); Iterable<String> iterable = collection;
6) Collection<String> collection = Lists.newArrayList("a3"); OrderedIterable<String> orderedIterable = FastList.newListWith("a3"); Iterable<String> iterable = collection;
7) List<String> list = Lists.newArrayList("2", "4", "13", "31", "43"); MutableList<String> mutableList = FastList.newListWith("2", "4","13", "31", "43");
8) Collection<String> collection = Lists.newArrayList("a1", "a2", "a3", "a1"); MutableCollection<String> orderedIterable = FastList.newListWith("a1", "a2", "a3", "a1"); Iterable<String> iterable = collection;
9) Collection<String> collection = Lists.newArrayList("2", "14", "3", "13", "43"); MutableCollection<String> mutableCollection = FastList.newListWith("2", "14", "3", "13", "43"); Iterable<String> iterable = collection;
5.3 ,
役職 | JDK | guava | apache | gs-collections |
---|
| collection1.containsAll(collection2) | Iterables.elementsEqual(iterable1, iterable2) | CollectionUtils.containsAll(collection1, collection2) | mutableCollection1.containsAll(mutableCollection2) |
| !Collections.disjoint(collection1, collection2) | !Sets.intersection(set1, set2).isEmpty() | CollectionUtils.containsAny(collection1, collection2) | !mutableSet1.intersect(mutableSet2).isEmpty() |
() | Set<T> result = new HashSet<>(set1); result.retainAll(set2) | Sets.intersection(set1, set2) | CollectionUtils.intersection(collection1, collection2) | mutableSet1.intersect(mutableSet2) |
| Collections.disjoint(collection1, collection2) | Sets.intersection(set1, set2).isEmpty() | !CollectionUtils.containsAny(collection1, collection2) | mutableSet1.intersect(mutableSet2).isEmpty() |
, (difference) | Set<T> result = new HashSet<>(set1); result.removeAll(set2) | Sets.difference(set1, set2) | CollectionUtils.removeAll(collection1, collection2) | mutableSet1.difference(mutableSet2) |
(symmetric difference) | | Sets.symmetricDifference(set1, set2) | CollectionUtils.disjunction(collection1, collection2) | mutableSet1.symmetricDifference(mutableSet2) |
| Set<T> result = new HashSet<>(set1); result.addAll(set2) | Sets.union(set1, set2) | CollectionUtils.union(collection1, collection2) | mutableSet1.union(mutableSet2) |
:
1) Collection<String> collection1 = Lists.newArrayList("a1", "a2", "a3", "a1"); Collection<String> collection2 = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> iterable1 = collection1; Iterable<String> iterable2 = collection2; MutableCollection<String> mutableCollection1 = FastList.newListWith("a1", "a2", "a3", "a1"); MutableCollection<String> mutableCollection2 = FastList.newListWith("a1", "a2", "a3", "a1");
2) Collection<String> collection1 = Lists.newArrayList("a1", "a2", "a3", "a1"); Collection<String> collection2 = Lists.newArrayList("a4", "a8", "a3", "a5"); Set<String> set1 = Sets.newHashSet("a1", "a2", "a3", "a1"); Set<String> set2 = Sets.newHashSet("a4", "a8", "a3", "a5"); MutableSet<String> mutableSet1 = UnifiedSet.newSetWith("a1", "a2", "a3", "a1"); MutableSet<String> mutableSet2 = UnifiedSet.newSetWith("a4", "a8", "a3", "a5");
3) () Collection<String> collection1 = Lists.newArrayList("a1", "a2", "a3", "a1"); Collection<String> collection2 = Lists.newArrayList("a4", "a8", "a3", "a5"); Set<String> set1 = Sets.newHashSet("a1", "a2", "a3", "a1"); Set<String> set2 = Sets.newHashSet("a4", "a8", "a3", "a5"); MutableSet<String> mutableSet1 = UnifiedSet.newSetWith("a1", "a2", "a3", "a1"); MutableSet<String> mutableSet2 = UnifiedSet.newSetWith("a4", "a8", "a3", "a5");
4) , (difference) Collection<String> collection1 = Lists.newArrayList("a2", "a3"); Collection<String> collection2 = Lists.newArrayList("a8", "a3", "a5"); Set<String> set1 = Sets.newHashSet("a2", "a3"); Set<String> set2 = Sets.newHashSet("a8", "a3", "a5"); MutableSet<String> mutableSet1 = UnifiedSet.newSetWith("a2", "a3"); MutableSet<String> mutableSet2 = UnifiedSet.newSetWith("a8", "a3", "a5");
5) (symmetric difference) Collection<String> collection1 = Lists.newArrayList("a2", "a3"); Collection<String> collection2 = Lists.newArrayList("a8", "a3", "a5"); Set<String> set1 = Sets.newHashSet("a2", "a3"); Set<String> set2 = Sets.newHashSet("a8", "a3", "a5"); MutableSet<String> mutableSet1 = UnifiedSet.newSetWith("a2", "a3"); MutableSet<String> mutableSet2 = UnifiedSet.newSetWith("a8", "a3", "a5");
6) Set<String> set1 = Sets.newHashSet("a1", "a2"); Set<String> set2 = Sets.newHashSet("a4"); MutableSet<String> mutableSet1 = UnifiedSet.newSetWith("a1", "a2"); MutableSet<String> mutableSet2 = UnifiedSet.newSetWith("a4"); Collection<String> collection1 = set1; Collection<String> collection2 = set2;
5.4
役職 | JDK | guava | apache | gs-collections |
---|
| Collections.sort(list); | Ordering.natural().sortedCopy(iterable) | | mutableList.sortThis() |
| collection.removeIf((s) -> s.contains(«1»)) | Iterables.removeIf(iterable, (s) -> s.contains(«1»)) | CollectionUtils.filter(iterable, (s) -> !s.contains(«1»)) | mutableCollection.removeIf((Predicate<String>) (s) -> s.contains(«1»)) |
| collection.removeIf((s) -> !s.contains(«1»)) | Iterables.removeIf(iterable, (s) -> !s.contains(«1»)) | CollectionUtils.filter(iterable, (s) -> s.contains(«1»)) | mutableCollection.removeIf((Predicate<String>) (s) -> !s.contains(«1»)) |
| collection.stream().map((s) -> s + "_1").collect(Collectors.toList()) | Iterables.transform(iterable, (s) -> s + "_1") | CollectionUtils.transform(collection, (s) -> s + "_1") | mutableCollection.collect((s) -> s + "_1") |
| collection.stream().forEach((s) -> s.append("_1")) | Iterables.transform(iterable, (s) -> s.append("_1")) | CollectionUtils.transform(collection, (s) -> s.append("_1")) | mutableCollection.forEach((Procedure<StringBuilder>) (s) -> s.append("_1")) |
1) List<String> jdk = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> iterable = jdk; MutableList<String> gs = FastList.newList(jdk);
2) Collection<String> jdk = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> guava = Lists.newArrayList(jdk); Iterable<String> apache = Lists.newArrayList(jdk); MutableCollection<String> gs = FastList.newList(jdk);
3) Collection<String> jdk = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> guava = Lists.newArrayList(jdk); Iterable<String> apache = Lists.newArrayList(jdk); MutableCollection<String> gs = FastList.newList(jdk);
4) Collection<String> collection = Lists.newArrayList("a1", "a2", "a3", "a1"); Iterable<String> iterable = collection; Collection<String> apache = Lists.newArrayList(collection); MutableCollection<String> mutableCollection = FastList.newList(collection);
5) Collection<StringBuilder> jdk = Lists.newArrayList(new StringBuilder("a1"), new StringBuilder("a2"), new StringBuilder("a3")); Iterable<StringBuilder> iterable = Lists.newArrayList(new StringBuilder("a1"), new StringBuilder("a2"), new StringBuilder("a3"));; Collection<StringBuilder> apache = Lists.newArrayList(new StringBuilder("a1"), new StringBuilder("a2"), new StringBuilder("a3")); MutableCollection<StringBuilder> gs = FastList.newListWith(new StringBuilder("a1"), new StringBuilder("a2"), new StringBuilder("a3"));
VI.
5.1
( Java, ):
1)
() — , ,
—
— ,
—
— , ,
—
— ,
, ,
—
—
,
2)
(Stack) — , «LIFO» (« — »).
, /.
3)
(Queue) — , «FIFO» (« — »).
/.
4)
(Double-ended queue) — ,
.
5)
(. priority queue) — ,
. ,
—
(heap) — , ,
6)
(), (Associative array, Dictionary) — ,
«— »
—
- (hashtable) — , ,
—
- (Multimap multihash) — -,
,
—
- - (bi-map) — -,
, ,
—
- (hashtable) — -, ,
—
- (hashtable) — -, ,
7)
— ,
,
—
— , ,
,
—
— , , ,
—
— , , ,
8)
— 1 0,
9)
—
,
10)
— , ,
11)
— ,
Java :
: , .
VII. おわりに
, , , . , ( ) , - .
github' .
, :
1.
java.util.concurrent.* tutorial2.
Trove library: using primitive collections for performance3.
Java performance tuning tips4.
Large HashMap overview5.
Memory consumption of popular Java data types6. , , , javadoc
PPS opensource [useful-java-links](https://github.com/Vedenin/useful-java-links/tree/master/link-rus) — , Java , . [ ](https://github.com/Vedenin/useful-java-links/) opensource [Hello world](https://github.com/Vedenin/useful-java-links/tree/master/helloworlds) Java maven ( ).