最近、私が尋ねられたインタビューで、ハッシュマップのバケットとは正確には何ですか?配列か配列リストか、それとも何ですか?
混乱しました。ハッシュマップは配列によって支えられていることを知っています。だから私はバケットがハッシュコードを保存する開始で16の容量を持つ配列であり、どのリンクリストに開始ポインタがあると言うことができますか?
ハッシュマップが内部的にどのように機能するかは知っていますが、データ構造の観点からバケットとは何かを知りたいだけです。
いいえ、バケットは、参照している配列内の各要素です。以前のJavaバージョンでは、各バケットにマップエントリのリンクリストが含まれていました。新しいJavaバージョンでは、各バケットにはエントリのツリー構造またはリンクエントリのリスト。
Java 8:の実装ノートから
/*
* Implementation notes.
*
* This map usually acts as a binned (bucketed) hash table, but
* when bins get too large, they are transformed into bins of
* TreeNodes, each structured similarly to those in
* Java.util.TreeMap. Most methods try to use normal bins, but
* relay to TreeNode methods when applicable (simply by checking
* instanceof a node). Bins of TreeNodes may be traversed and
* used like any others, but additionally support faster lookup
* when overpopulated. However, since the vast majority of bins in
* normal use are not overpopulated, checking for existence of
* tree bins may be delayed in the course of table methods.
...
バケット正確にはノードの配列です。したがって、単一のバケットはクラスJava.util.HashMap.Nodeのインスタンスです。各NodeはLinkedListに似たデータ構造であるか、TreeMapのようなものかもしれません(Java 8)なので、HashMapはパフォーマンスにとって何が良いかを判断します-バケットをLinkedListまたはTreeMapとして保持します。多くのエントリが単一のバケットに配置される場合、hashCode()関数の設計が不十分な場合にのみTreeMapが選択されます。
/**
* The table, initialized on first use, and resized as
* necessary. When allocated, length is always a power of two.
* (We also tolerate length zero in some operations to allow
* bootstrapping mechanics that are currently not needed.)
*/
transient Node<K,V>[] table;
バケットは基本的に、オペレーティングシステムのページングアルゴリズムで使用されているデータ構造です。非常にレイマンの言語になること。
特定のハッシュコードを表すオブジェクトは、そのバケットに保存されています(基本的に、リンクリストデータ構造のヘッダーは、バケットの用語で表されるハッシュコード値であると考えることができます)
オブジェクトの参照は、ヘッダーがハッシュコードの値を表すリンクリストに保存されています。
JVMはそれらを作成し、サイズはJVMによって割り当てられているメモリに依存します。