「ゴールド9シルバー10」ヌードルファクトリー、90%がHashMapの質問をされます!(回答を含む)

序文

9ゴールドと10ゴールドのゴールデンリクルート期間です。準備はいいですか?HashMapは、インタビュアーが尋ねなければならない知識ポイントです。その内部の基本的な実装原則は、すべてのインタビュアーが習得する必要があります。HashMapの内部実装の原則を本当に習得し、インタビュアーの苦痛に直面した場合にのみ、急ぐ必要はありません。 。
最近、仕事を見つけるのに最適な時期です。主要メーカーからのインタビューの質問と今年(2020年)の最新データを収集しました。以下はデータのスクリーンショットです(すべてのデータはドキュメントに統合され、pdfは圧縮およびパッケージ化されています) 。
困っている友達がいる場合は、ここをクリックして情報を入手できます。コード:qf

ここに写真の説明を挿入

面接の質問

1.HashMapの基盤となるストレージ構造

HashMapは、Jdk1.7では配列とリンクリストのデータ構造を採用し、jdk1.8以降では配列とリンクリストと赤黒ツリーのデータ構造を採用しました。ソースコードを観察すると、HashMapクラスの非常に重要なフィールドは、ハッシュバケットの配列であるNode []テーブルであることがわかります。NodeはHashMapの内部クラスであり、Map.Entryインターフェイスを実装し、それ自体がキーと値のペアです。

2.ハッシュの競合を解決する方法HashMapはハッシュの競合を解決するためにどのような方法を使用しますか?

HashMapは、ハッシュテーブルを使用してデータを格納します。もちろん、ハッシュテーブルでは、必然的にハッシュの競合の問題が発生します。ハッシュの競合を解決するには、おおよそ2つの方法があります。

1.オープンアドレス方式:アドレスが競合する場合、空の場所が見つかるまで、特定の方式に従ってハッシュテーブル内の他のストレージユニットを検出し続けます。

2.チェーンアドレス方式:チェーンアドレス方式は、配列とリンクリストを組み合わせたものです。各配列要素はリンクリスト構造になっています。アドレスが競合する場合、データはリンクリストに格納されます。

HashMapは、チェーンアドレス方式を使用してハッシュの競合を解決します。

3. jdk1.8のHashMapで、赤黒のツリーを生成するチェーンはいくつありますか?

HashMapは、チェーンアドレス方式を使用してハッシュの競合を解決します。リンクリストの長さが長すぎると、HashMapのパフォーマンスに深刻な影響を及ぼします。そのため、jdk1.8では、データ構造がさらに最適化され、赤黒ツリーが導入されています。リンクリストの長さが8を超えると、リンクリストは赤黒ツリーに変換され、赤黒ツリーの特性を使用してHashMapを改善し、すばやく追加、削除、変更、確認することができます。赤黒ツリーのパフォーマンスは、挿入、削除、検索、およびその他のアルゴリズムに使用されます。
ここに写真の説明を挿入
4. HashMapの初期値と負荷率はどのくらいですか?

hashMapの初期の長さは16で、負荷係数は0.75です。HashMapに含まれるデータの最大量は、長さ*負荷係数です。つまり、長さがこの値に達すると拡張が発生します。

5.HashMap拡張メカニズム

サイズ変更とは、容量を再計算し、要素をHashMapオブジェクトに継続的に追加することです。また、HashMapオブジェクト内の配列がそれ以上要素をロードできない場合、オブジェクトは、より多くの要素をロードできるように配列の長さを拡張する必要があります。もちろん、Javaの配列は自動的に拡張できません。小さなバケットを使用して水を貯蔵するのと同じように、新しい配列を使用して既存の配列を小さな容量に置き換える方法です。より多くの水を貯蔵したい場合は、大きなバケットを変更する必要があります。 。最下層は、resizeメソッドのtransferメソッドが元のEntryアレイの要素を新しいEntryアレイにコピーすることです。展開は2の累乗からNの累乗(通常は2倍)で実行されます。

6、HashMapスレッドの安全性の問題HashTable ConcurrentHashMap

HashMapはスレッドセーフではありません。複数のスレッドが同時にHashMapを書き込むと、データの不整合が発生する可能性があります。スレッドの安全性を満たす必要がある場合は、ConcurrentHashMapを使用でき、HashTableがあります。ただし、HashTableはDictionaryクラスから継承されます。HashTableコンテナは、スレッドの安全性を確保するために同期を使用します。ただし、激しいスレッド競合の場合、HashTableの効率は非常に低くなります。ConcurrentHashMapは、セグメントセグメントロックを使用するセグメント配列構造とHashEntry配列構造で構成されます。スレッドの安全性を確保してください。

HashTableのキーも値もnullにすることはできません。HashMapでは1つのキーのみをnullにすることができ、複数の値をnullにすることができます。また、HashTableはスレッドセーフであり、HashMapはスレッドセーフではありません。

7、HashMapリンクリストをリングに

HashMapスレッドは安全ではないため、安全でない理由と問題が発生する場合については、ここで説明します。

hashMapのputメソッドを一緒に操作するスレッドが複数ある場合、現時点ではhashMapの容量が不足しており、両方のスレッドが展開してサイズ変更メソッドを実行します。このとき、cpuがリソースを切り替えると、リンクリストループやエンドレスループの問題が発生します。

オフトピック

これまでのところ、HashMapインタビューの質問の要約(回答付き)に関するこの記事が紹介されています。
困っている友人がいる場合は、ここをクリックして情報を入手できます。コード:qf **
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/w1103576/article/details/108739556