「それで、プロセッサーの調子はどうですか?」

「大丈夫です。液体窒素の中に 1 時間置いたので、今は新品同様です!」

「わかりました。それでは続けましょう。」

「セットコレクション」

数学的に言えば、セットとは固有の要素のグループです。したがって、プログラミングでは、Set は一意の要素のコレクション、つまり、同一の要素を格納できないコレクションです。

「エリーがセットの継承階層を示したかどうかはわかりません。そうでない場合は、次のとおりです。」

Set インターフェイスと Queue インターフェイスの実装 - 1

HashSet は、 hashCode () メソッドによって返されたハッシュ値を使用して要素を内部的に格納するコレクションです。」

簡単にするために、HashSet<E> は、HashSet の値をキーとして保存する HashMap<E, Object> オブジェクトを保存します。

"うわあ!"

「ハッシュ コードを使用すると、セットの要素をすばやく検索、追加、削除できます。」

「ただし、クラスのオブジェクトを Set に追加し、セット内で正しく検索するには、クラスでhashCode メソッドとqualsメソッドを適切に実装する必要があることに注意してください。」

"どちらのメソッドもHashSet/HashMap内でよく使用されます。 "

「 hashCode () メソッドの実装を忘れると、オブジェクトが存在する場合でも、セット内でオブジェクトを見つけられなくなる危険があります。」

「はい、覚えています、覚えています。このことについては前に話してくれましたね。それについてはすべて聞いています。」

「わかりました。それでは、さらに役立つ情報をご紹介します。」

「クラスにhashCode と等しいもの を正しく実装し、オブジェクトを Set に喜んで保存したとします。」

「しかし、オブジェクトの 1 つを変更すると、そのハッシュの計算に使用される内部データが変更されます。したがって、オブジェクトのハッシュが変更されます。」

「そしてこれは、セット内でそれを検索しても、おそらく見つからないことを意味します。」

「おお!それはどうやって機能するのですか?」

「これは、ハッシュを扱う際のよく知られた落とし穴です。本質的に、HashSet (および HashMap) 検索は、オブジェクトが不変である場合にのみ適切に機能することが保証されます。」

「おっと!それで、誰も何もしてくれないの?」

「誰もが問題が存在しないふりをします。しかし、これはインタビューで頻繁に話題になるので、覚えておく価値があるかもしれません...」

LinkedHashSetは、その要素もリンクされたリストに格納される HashSet です。通常の HashSet は要素の順序付けをサポートしません。第一に、これは単に正式な操作ではありません。第二に、内部順序さえも、単一の操作を行うと大幅に変わる可能性があります。要素が追加されます。」

ただし、 LinkedHashSetからイテレータを取得し、それを使用して、 LinkedHashSetに追加された順序ですべての要素を処理することができます。頻繁に起こることではありませんが、時にはこれが非常に必要になることがあります。」

「なるほど。私は、このような「万が一の」シナリオのためにクラスが存在するのが大好きです。そのようなケースはそれほど珍しいことではありません。」

" TreeSet は、値で順序付けされたツリーの形式で要素を格納するコレクションです。TreeSet <E> には、これらの値をすべて格納する TreeMap <E, Object> が含まれます。そして、このTreeMap、バランスのとれたと黒のツリーを使用して格納します。その結果、非常に高速な追加、削除、包含操作がサポートされます。」

「はい、覚えています。つい最近もそのことについて話し合いました。それから、これがどこで使われるかについても考えました。」

「そして、Java の最も人気のあるコレクションのいくつかがそれを使用していることが判明しました。」

「そうです。ところで、面接官はよくTreeSetについて質問します。彼らは通常、あなたを騙そうとしているのです。彼らはこう言います、『TreeSet がバイナリ ツリーを使用している場合、すべての要素が 1 つの長い枝を形成できるため、検索には時間がかかります』 「今こそ、「TreeSet と TreeMap が赤と黒のバランスの取れた木を使用することは子供でも知っているので、そのような状況は実際には不可能であることを子供でも知っています。」と言って、傲慢な奴を自分の代わりに置くときです。」

「ああ。その質問をした人の顔が見てみたい。そのフレーズを覚えてもいいかもしれない。…」

「しかし、実際にやってみると、Set は私が当初考えていたほど単純ではないことが判明しました。」

「一方、Queueの状況ははるかに単純です。」

Set インターフェイスと Queue インターフェイスの実装 - 2

" Queue はキューを実装します。要素はキューの最後に追加され、先頭から取得されます。"

" PriorityQueue は、技術的にはキューでもあるLinkedListを除いて、実際にはQueueインターフェイスの唯一の古典的な実装です。"

「はい、疲れてきました。今日はここまでです。また次回まで。」