序文:
なぜ面接はハッシュマップについて尋ねるのですか?
HashMapの動作原理は、現在のJavaインタビューでよく聞かれる質問の1つです。主に、Hashmapが使用されているかどうか、hashMapのハッシュ衝突のメカニズム、hashMapの拡張方法、およびの基礎となるデータ構造が含まれます。 hashMap。jdk1.8でハッシュアルゴリズムとアドレス指定アルゴリズムを最適化する方法
今日はみんなで9つの面接の質問を整理しましたが、今年は彼女を見つけることができるという面接で聞かれるチャンスを超えたと思います!
1. HashMapの原理、内部データ構造?
- 最下層はハッシュテーブル(配列+リンクリスト)を使用します。リンクリストが長すぎる場合、リンクリストは赤黒木に変換され、O(logn)時間計算量内で検索を実行します。
2.HashMapのputメソッドプロセスについて教えてください。
- キーのハッシュ値を見つけて、添え字を計算します。
- 衝突がない場合は、直接バケットに入れます。
- 衝突がある場合は、リンクリストの後ろにリンクします。
- リンクリストの長さがしきい値(TREEIFY_THRESHOLD == 8)を超えると、リンクリストは赤黒木に変換されます。
- ノードがすでに存在する場合は、古い値を置き換えます
- バケットがいっぱいの場合(容量*負荷率)、サイズを変更する必要があります。
3.ハッシュ関数はHashMapにどのように実装されていますか?他にどのようなハッシュ実装がありますか?
- 上位16ビットは変更されず、下位16ビットと上位16ビットはXORされます。
- (N-1)&ハッシュ->添え字を取得
- 他のハッシュ実装方法:ブログEffective Java study notes-hashCode()を参照できます。
4. HashMapの競合を解決する方法は?拡張プロセスについて説明しましょう。値が元の配列にあり、新しい配列が移動された場合、位置が変更されている必要があります。この値の新しい配列の位置は何ですか。 ?
- リンクリストに新しいノードを追加した後、
- 容量が2倍になり、ノードごとにハッシュ値が再計算されます。
- この値は2つの場所にのみ存在できます。1つは元の添え字の位置であり、もう1つは添え字が<元の添え字+元の容量>である位置です。
5. HashMapとは別に、ハッシュの競合に対してどのような解決策がありますか?
- オープンアドレス法、チェーンアドレス法
HashMapの特定のエントリチェーンが長すぎる場合、検索の時間計算量がO(n)に達する可能性があります。最適化するにはどうすればよいですか?
- リンクリストを赤黒木に変えると、JDK1.8が実装されました。
arrayとArrayListの違い。
- 配列には基本型とオブジェクト型を含めることができ、ArrayListにはオブジェクト型のみを含めることができます
- 配列サイズは固定されており、ArrayListサイズは動的に変更できます
- ArrayListは、より多くの機能を提供します(
addAll
、removeAll
)。
Arraylistがソートを実装する方法
Collections.sort(List<T> list)
;sort(List<T> list, Comparator<? super T> c)
;
6.HashMap
-
配列+リンクリストストレージ
-
デフォルトの容量:16(2 ^ nが適切です。定義された初期容量が2 ^ nでない場合、容量は初期容量より2 ^ n大きい最小値として定義されます)
- 例:初期容量は13、実際の容量は16です。
プット:
-
変換计計算:((key.hashCode()^(key.hashCode()>>> 16))&(table.length-1))
-
リンクリストを検索し、リンクリストの長さを記録します。リンクリストの長さがTREEIFY_THRESHOLD(8)に達すると、チェーンは赤黒木に変換されます。
-
リンクリストで見つかった場合は古い値を置き換え、見つからない場合は続行します
-
要素の総数が容量*負荷係数を超えると、容量は2倍になり、再度ハッシュされます。
- (要素の添え字は変更されないか、[元の添え字+元の容量]になります)。
-
リストの最後に新しい要素を追加します
-
スレッドセーフではありません
7.HashTable
-
配列+リンクリストストレージ
-
デフォルトの容量:11(素数が適切です)
-
プット:
- インデックスの計算:(key.hashCode()&0x7FFFFFFF)%table.length
- リンクリストで見つかった場合は古い値を置き換え、見つからない場合は続行します
- 要素の総数が容量*負荷係数を超えると、容量は2倍になり、再度ハッシュされます。
- リンクリストの先頭に新しい要素を追加します
-
スレッドセーフを確保するために、Hashtableの内部共有データを変更するメソッドにSynchronizedが追加されました。
8. HashMap、HashTable区
- デフォルトの容量は異なります。
- 指数の計算方法が異なります。
- HashMapは、長すぎるリンクリストを赤黒木に一意に変換します。
- 新しい要素の位置が異なります。
- スレッドセーフ
9.HashMapとConcurrentHashMapの違い。
- インデックス計算により、最上位ビットの影響が排除されます
- デフォルトの容量:16(初期容量©が定義されている場合、容量は(c +(c >>> 1)+1)より大きい最小の2 ^ nとして定義されます)
- 例:初期容量は13、実際の容量は32です。
- スレッドセーフ、優れた同時パフォーマンス
- 良好な同時実行パフォーマンスの理由は、ConcurrentHashMapが同期メソッドを定義せず、リンクリストの先頭で同期するためです。異なるリンクリストは相互に影響を与えません。
パーソナルビビ
上記の面接の質問に対する回答は、ドキュメントノートにまとめられています。また、2020年にいくつかの大企業によって収集されたいくつかのインタビュー資料と最新のインタビューの質問を整理しました(すべてドキュメントにまとめられ、スクリーンショットのごく一部です)。必要な小さなパートナーは、ここをクリックしてください。パスワード:CSDN。あなたが最近インタビューに参加していたなら、多分それはあなたを助けることができます!
注意してください、迷子にならないでください!この記事があなたに役立つなら、好きでサポートすることを忘れないでください!