2016-06-22 7 views
7

最近、インタビューでハッシュマップのバケツはどういうものなのですか?それは配列かarraylistか何であるかどうか?ハッシュマップのバケットは正確には何ですか?

私は混乱しました。私は、ハッシュマップが配列によってサポートされていることを知っています。だから私は、バケットは、最初に16の容量のハッシュコードを格納する配列であり、リンクされたリストはスタートポインタを持っていると言うことができますか?

私はハッシュマップが内部的にどのように動作するのか知っていますが、ちょうどデータ構造の点でバケツが何であるかを知りたかっただけです。

+1

あなたがこれを読んでする必要があります(http://stackoverflow.com/questions/6493605/how-does-a-java-hashmap-handle-different-objects-with -the-hash-code/6493946#6493946) – emotionlessbananas

+0

@JonnyHenly:バケツは何ですか?上記の質問では、ハッシュコードとハッシュマップの実装にもっと取り組んでいます。だから私は私の質問を重複しているとは考えていない。質問は似ているかもしれませんが、彼らが求めている答えは異なります。 – dgupta3091

答えて

14

いいえ、バケットは、あなたが参照している配列の各要素です。以前のJavaバージョンでは、各バケットにマップエントリのリンクリストが含まれていました。新しいJavaバージョンでは、各バケットにはツリー構造のエントリまたはリンクされたエントリのリストが含まれています。 Javaの8で実装Notesから

/* 
* 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. 
... 
+0

ハッシュマップは最初は16の容量を持っていますので、その時点では16のスペースの配列が作成され、各要素はバケットとして呼び出されます。 – dgupta3091

+0

@ dgupta3091はい。ただし、Java 8の実装では、配列は遅れて作成されます(つまり、最初のエントリがHashMapに配置されている場合のみ)。 – Eran

+0

@ JonnyHenly私はJava 8で実装をチェックしましたが、コンストラクタのどれもが配列を初期化しません。これは 'resize()'(配列がnullの場合は 'put'によって呼び出されます)と' readObject(java.io.ObjectInputStream s) '(非直列化)によってのみ初期化されます。 – Eran

13

bucket

私は、これはあなたがよくハッシュマップの実装を理解するのを助けることができる願っています。

0

バケットは基本的に、オペレーティングシステムのページングアルゴリズムで使用されているデータ構造です。非常にLaymans言語になること。特定のハッシュコードを表す

オブジェクトは、そのバケット内に格納されている。(基本的には、バケットの用語で表されるハッシュコード値にリンクされたリストデータ構造のヘッダを考慮することができる)

参照のオブジェクトがリンクリストに格納されている場合、そのヘッダーはハッシュコードの値を表します。

JVMがそれらを作成し、サイズは、JVMによって割り当てられるメモリによって異なります。

0

バケット正確にはは、ノードの配列です。したがって、単一バケットはjava.util.HashMap.Nodeクラスのインスタンスです。各ノードはLinkedListに似たデータ構造ですが、TreeMap(Java 8以降)のように、HashMapはパフォーマンス上の方が良いと判断します。バケットをLinkedListまたはTreeMapとして保持します。 TreeMapは、多くのエントリが単一のバケットに配置されるときに、うまく設計されていないhashCode()関数の場合にのみ選択されます。 バケットがHashMapの中でどのように見えるかを参照してください:

/** 
    * 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; 
関連する問題