3


0

ハッシュ表。 使い方?

今、私は「ハッシュテーブル」を構築する方法を理解しようとしています。

最も興味深いのは、オブジェクトが「ハッシュテーブル」に追加されるときですか?

私は次のような本を読みました:

最初のステップ:計算された `hashCode()`オブジェクト。

次に、 Hashtable`でこのオブジェクトの位置を決定します: obj.hashCode()%Hashtable.length`。

たとえば、 `Hashtable`に要素を追加します:

Hashtable hm=new Hashtable(100);

        hm.put("Lee","Lee");
        hm.put("lee","lee");
        hm.put("eel","eel");

オブジェクトを配置するバケットを定義します。

    System.out.println("Lee".hashCode() % 100);
    System.out.println("lee".hashCode() % 100);
    System.out.println("eel".hashCode() % 100);

アルゴリズムを理解している場合、オブジェクトを次のように表に配置する必要があります。

eel /*because,"eel".hashCode() % 100=0*/,
lee /*because, "lee".hashCode() % 100=20*/,
Lee /*because, "Lee".hashCode() % 100=68*/

しかし、結果として何が見えますか?

System.out.println(hm);

{Lee=Lee, lee=lee, eel=eel}

教えてください、どこで間違ったのですか?

4 Answer


7


Hashtable(および` HashMap`)要素の繰り返し順序は保証されていません(実装依存)ので、私見では理論を構築しようとすることはあまり意味がありません。 異なるJavaバージョン間でも変更される場合があります(Java5からJava6に変更されました)。

Bash Hashtable`は廃止されました。代わりに HashMap`を使用(および分析)することをお勧めします。

あなたの説明は、基本的なハッシュマップの実装として私に聞こえます。 ただし、少なくともJava4以降、HashMapの実際の実装はそれよりもかなり洗練されています。 E.g. ハッシュテーブルのサイズは常に2のべき乗です(これは、あなたが説明するような基本的なハッシュテーブルにとっては非常に悪い決定です)。また、キーオブジェクトから取得したハッシュ値は、テーブルの。 詳細については、Java Specialistニュースレターの次の問題を参照してください。


2


ハッシュテーブルは、キーから値へのマッピングです。 ハッシュテーブルを印刷するときに表示されるのはこのマッピングです。

.hashCode`と .equals`の話は、キー/値のペアを内部で追跡する方法の大まかな説明です。

あなたの質問に関するいくつかの発言:

  • あなたの例で100に設定した「容量」は、*しません オブジェクトを保存するバケット*の数を表します。 Hashtableが容量を持つオブジェクトの数を表し、負荷係数は .75.

  • バケットの数は実行中に変化する可能性があります。 追加し続けたら オブジェクトを長時間使用すると、負荷率が増加し、バケットが再割り当てされ、オブジェクトが「再ハッシュ」される可能性があります。

_ _負荷係数は、容量が自動的に増加する*前にハッシュテーブルがどれだけいっぱいになるかを示す尺度です。 初期容量と負荷係数のパラメータは、*実装への単なるヒントです。 rehashメソッドがいつ、いつ呼び出されるかについての正確な詳細は、*実装依存*です。 _


1


ハッシュテーブルの概念は、いくつかのハッシュ関数に従ってオブジェクトをテーブルに追加することです(オブジェクトを取得してインデックスを返します)。

ハッシュテーブルの説明は多くの(多く…​)の1つにすぎず、Javaと同じように実装されていれば驚かれるでしょう。


0


前に述べたように、Hashtableは実装に依存するため、Hashtable全般について読み、それらがどのように機能するかを理解し、Javaまたは他の言語の特定の実装についてどのように機能するかを理解した後に読むことをお勧めします。

Wikipediaにはこのトピックに関する非常に良い記事がありますので、最初にこれを読むことをお勧めします。