「そして最後に、マップについてお話します。」

「ご存知のとおり、Map には一連のキーと値のペアが格納されます。キーは一意である必要がありますが、値は何でも構いません。キーと値のペアを Map に追加し、コレクションにすでにそのキーが含まれている場合、古い値は新しい値に置き換えられます。言い換えれば、キーは任意のオブジェクトになり得る特別なインデックスのように機能します。」

マップは、(x, y) のペアのセットを表す数学用語で、それぞれの一意の x が何らかの y に対応します。

プログラマーは Map を非常に好むため、ここでは Map インターフェイスを実装する 4 つの異なるコレクションを紹介します。

「その単純な継承構造は次のとおりです。」

マップ階層 - 1

「黄色は、EntryがMapインターフェイス内のネストされたインターフェイスであることを示します。」

「要素のペアを単一の実体として記述するためにエントリが追加されました。」

"Map<K,V> のメソッドは次のとおりです。"

メソッド 説明
int size() マップ内のペアの数を返します。
boolean isEmpty() マップが空かどうかを確認します。
boolean containsKey(Object key) マップには指定されたキーが含まれていますか?
boolean containsValue(Object value) マップには指定された値が含まれていますか?
V get(Object key) 指定されたキーの値を返します。
V put(K key, V value) キーに新しい値を設定します。
メソッドは古い値または null を返します。
putAll(Map<? extends K, ? extends V> m) 別のマップからペアを追加します。
void clear() マップをクリアします。つまり、すべてのペアを削除します。
Set<K>keySet() キーのセットを返します。
Collection<V>values() 値のコレクションを返します。
Set<Map.Entry<K, V>>entrySet() ペアのセットを返します。

「K と V はキーと値の型パラメータです。」

「そうですね、私はほとんどの方法には精通していますが、実際に取り組んだことがあるのは一部だけです。」

「エントリークラスについて他に何か教えていただけますか?」

「このクラスは要素のペアを記述します。これにはいくつかのメソッドがあります。」

メソッド 説明
getKey() キーと値のペアのキーを返します。
getValue() キーと値のペアの値を返します。
setValue(V value) キーと値のペアに新しい値を設定します。

「エントリはマップ全体を渡さずにメソッドにペアを渡せるので便利です。」

"そうか。"

「次に、Map の実装について説明します。」

「最初はHashMapです。これは要素を格納するためにハッシュ テーブルを使用します。キーと値は null だけでなく任意の型にすることができます。コレクションが変更されると要素の順序が変わる可能性があります。」

「要素はグループまたはバケットのセットとして HashMap に保存されます。要素の hashCode() メソッドによって、要素がどのバケットに分類されるかが決まります。」

「非常に大まかに言うと、1 ~ 100 のハッシュ コードを持つ要素は最初のバケットに分類され、101 ~ 200 の値を持つ要素は 2 番目のバケットに分類されます。」

「この方法で要素を保存することのポイントは、要素を検索または削除するときに、無関係なバケット内のすべての要素を削除できることです。」

"そうか。"

「HashMap に関する非常に優れた記事があります。ぜひ読んでおくことをお勧めします: https://medium.com/@mr.anmolsehgal/java-hashmap-internal-implementation-21597e1efec3

"2 番目のコレクションはLinkedHashMapです。HashMap との主な違いは、項目をリンクされたリストとしても保存することです。通常の HashMap では、要素の順序は未定義であり、時間の経過とともに変更される可能性があります。また、LinkedHashMap からイテレータを取得できます。これを使用して、LinkedHashMap に追加された順序ですべての要素を確認します。さらに、LinkedHashMap には、最後の使用/アクティビティの順序ですべてのペアを確認できるイテレータがあります。

「LinkedHashMap に関する非常に優れた記事があります。こちらをご覧ください: https://medium.com/@mr.anmolsehgal/java-linkedhashmap-internal-implementation-44e2e2893036

「今日話したい 3 番目のコレクションはTreeMapです。」

" TreeMap は要素を昇順で並べ替えます。これは、TreeMap がバランスの取れた赤と黒のツリーを使用して要素を格納するという事実によって実現されます。"

「その結果、挿入時間と検索時間は非常に短くなります。このクラスは、非常に大量のデータを使用する場合に最適です。」

「そしてもちろん、TreeMap に関する記事もあります: https://medium.com/xebia-engineering/treemap-internals-199e0e0050b5

「まだ話していないことは何ですか?」

「WeakHashMap ですが、リシが数日前にそれについて教えてくれました。」

"いつでしたか?"

「彼が SoftReference、WeakReference、PhantomReference について話したとき。」

「あなたがすべてに正しい名前を付けたことを考えると、私はあなたを信じます。それではリラックスしてください。今夜お会いしましょう。」

「さようなら、エリー。」