マップソースインタビューの質問の要約

マップソースインタビューの質問の要約

マップは、インタビューのインタビューの質問の大部分を占めており、その中でHashMapが主なものです。これらのインタビューの質問には、明確に説明できるものと、説明が難しいものがあります。

1つ:全体的なデータ構造の問題をマッピングする

1.1:HashMapの基礎となるデータ構造について話します

回答:HashMapの最下層は、配列+リンクリスト+赤黒ツリーのデータ構造です。配列の主な機能は、迅速な検索を容易にすることです。時間の複雑さはO(1)、デフォルトサイズは16、配列の添え字インデックスはキーのハッシュコードによって計算されます。配列要素はノードと呼ばれます。複数のキーのハッシュコードが同じであるが、キー値が異なる場合、単一のノードがリンクリストに変換されます。リンクリストのクエリの複雑さはO(n)です。リンクリストの長さが8以上で、配列がのサイズが64より大きい場合、リンクされたリストは赤黒ツリーに変換されます。赤黒ツリーのクエリの複雑さはO(log(n))です。簡単に言えば、クエリの最小数は赤黒ツリーの最大深度に相当します。

1.2:HashMap、TreeMap、LinkedHashMapの類似点と相違点は何ですか?

回答:同じ点:

  1. 特定の状況では、3つすべてが赤黒の木を使用します。
  2. 反復中に、マップのデータ構造が変更されると、ConcurrentModificationExceptionが報告されます。

差:

  1. ashMapのデータ構造は主に配列であり、クエリは非常に高速です。TreeMapのデータ構造は主に赤黒の木です。左が小さく右が大きい赤黒の木の特性を利用してキーの並べ替えを実現します。LinkedHashMapはHashMapに基づいてリンクリストを追加します。この構造は、挿入シーケンスアクセスと最小アクセス削除の2つの戦略を実現します。
  2. 3つのマップの基礎となるデータ構造が異なるため、3つの使用シナリオは異なります。TreeMapはキーで並べ替える必要があるシナリオ、LinkedHashMapは挿入順でのアクセス、または最もアクセスの少ない要素を削除する必要があるシナリオに適しています。残りのシナリオを使用します。 HashMapで十分です。私たちの作業のほとんどのシナリオでは、基本的にHashMapを使用しています。
  3. 3つのマップの基礎となるデータ構造が異なるため、上部パッケージのapiはわずかに異なります。
  4. HashMapはLinkedHashMapの基礎となるハッシュアルゴリズムと同じであり、TreeMapにはハッシュアルゴリズムがありません。

2:HashMapソースコードの詳細

2.1:HashMapはどのように拡張されますか?

回答:いつ拡張するか:

  1. 配置すると、配列が空であることが検出され、初期拡張が実行されます。デフォルトの拡張サイズは16です。
  2. プットが成功した後、既存のアレイのサイズが拡張しきい値よりも大きいことが判明すると、拡張が実行され、拡張は古いアレイのサイズの2倍になります。

拡張のしきい値はしきい値です。しきい値は拡張のたびに再計算されます。しきい値は、アレイのサイズ*影響係数(0.75)に等しくなります。

2.2:ハッシュが競合する場合はどうすればよいですか?

回答:ハッシュの競合とは、キー値のハッシュコード計算が同じであるが、キー値が異なる状況を指します。

バケットに要素が1つしかない場合、またはすでにリンクリストになっている場合、新しい要素はリンクリストの最後に直接追加されます。

バケット内の要素がすでにリンクされたリストであり、リンクされたリストの数が8以上である場合、現時点では2つの状況があります。

  1. この時点で配列のサイズが64未満で、配列が再度展開された場合、リンクされたリストは赤黒ツリーに変換されません。
  2. 配列サイズが64より大きい場合、リンクされたリストは赤黒の木に変換されます。

ここでは、リンクされたリストの数が8以上であると判断されるだけでなく、アレイのサイズも判断されます。アレイの容量は64未満です。すぐに変換されることはありません。赤黒のツリーはリンクされたリストよりもはるかに多くのスペースを占有し、変換にも時間がかかるため、アレイは容量が小さい場合、競合が深刻になります。まず容量を拡張して、容量を拡張することで競合の問題を解決できるかどうかを確認できます。

2.2:リンクリストの数が8以上の場合、リンクリストを赤黒ツリーに変換する必要があるのはなぜですか?

回答:リンクされたリストが多すぎると、トラバーサルに時間がかかる場合があります。赤黒ツリーに変換すると、トラバーサルの時間の複雑さを軽減できますが、赤黒ツリーに変換するには、スペースと時間のかかる変換コストが必要になります。緩い分布式の計算によると、通常の状況では、リンクされたリストの数の8の概念は1,000万分の1未満であるため、通常の状況では、リンクされたリストは赤黒の木に変換されません。この設計の目的は、異常を防ぐことです。たとえば、ハッシュアルゴリズムに問題があり、リンクされたリストの数が簡単に8以上になる場合でも、すばやくトラバースできます。

拡張質問:赤黒の木はいつリンクリストになりますか?

回答:ノード数が6以下の場合、赤黒ツリーは自動的にリンクリストに変換されます。主な考慮事項は、赤黒ツリーのスペースコストです。ノード数が6以下の場合、リンクリストのトラバースも高速であるため、赤黒です。ツリーは再びリンクリストになります。

2.2:HashMapが配置されているときに、キーがすでに配列に存在し、値を上書きしたくない場合はどうなりますか?得られた値が空のときにデフォルト値に戻したい場合はどうすればよいですか?

回答:配列にキーがあり、値を上書きしたくない場合は、putIfAbsentメソッドを選択できます。このメソッドには組み込み変数onlyIfAbsentがあります。組み込みがtrueの場合、上書きされません。通常使用するputメソッド、組み込みonlyIfAbsentはfalseであるため、上書きできます。の。

値を取得するときに、値が空でデフォルト値に戻したい場合は、getOrDefaultメソッドを使用できます。メソッドの最初のパラメーターはkeyで、2番目のパラメーターは戻りたいデフォルト値です(map.getOrDefault( "2"、 "0")など)。 、マップにキー2の値がない場合、デフォルトでは空ではなく0が返されます。

3:その他の地図インタビューの質問

3.1:DTOをマップのキーとして使用する場合、注意が必要な点はありますか?

回答:DTOはデータキャリアであり、多くの属性を持つJavaクラスと見なすことができます。これらの属性に対してgetおよびset操作を実行できます。

マップのタイプを確認します。HashMapの場合は、equalsメソッドとhashCodeメソッドをオーバーライドする必要があります。これは、getとputのときに、equalsメソッドを使用して同等性を判断する必要があるためです。TreeMapの場合、DTOはComparableインターフェイスを実装する必要があります。 TreeMapは、Comparableインターフェイスを使用してキーのサイズを決定します。それが、LinkedHashMapの場合、HashMapと同じです。

3.2:LinkedHashMapのLRUの意味は何ですか?どのように実装されますか?

回答:LRU、英語フルネーム:最近使用されていない、中国語は最近使用されていない、LinkedHashMapでは、最小アクセス削除戦略とも呼ばれます。removeEldestEntryメソッドを使用して特定の戦略を設定し、適切なタイミングで最も訪問されていない要素を作成できます。原則として、putメソッドの実行の最後に、LinkedHashMapがこの戦略をチェックし、それが戦略を満たしている場合は、ヘッドノードを削除します。

ヘッドノードが最も訪問されていない要素であることを確認する原則は、LinkedHashMapが取得すると、現在訪問されているノードをリンクされたリストの最後に移動します。ゆっくりと、ヘッドノードが最も訪問されていない要素になります。

3.3:TreeMapのすべての要素にComparableインターフェイスを実装することが推奨されるのはなぜですか?しかし、キーが文字列の場合、余分な作業はありませんか?

回答:TreeMapの最下層は、並べ替えによって2つのキーのサイズを比較することであるため、キーにComparableインターフェイスを実装して必要な並べ替え順序を作成することをお勧めします。また、String自体にComparableインターフェイスを実装しているため、Stringを使用する場合はStringだけでなく、追加の作業も必要ありません。Long、Double、Shortなどの他のパッケージタイプもComparableインターフェイスを実装しています。

4:まとめ

Mapのインタビューの質問は主にHashMapであり、多くのソースコードについて質問します。TreeMapとLinkedHashMapは、ボーナスアイテムとして、主に関数とシナリオに焦点を当てています。
マップインタビューの質問には多くの種類がありますが、原則を理解している限り、いくつの質問を変更しても、答えは簡単になります。

おすすめ

転載: blog.csdn.net/weixin_38478780/article/details/107927282