誰かがハッシュマップの作業メカニズムについて説明させてくれたら、「ハッシュベースのルール」という単純に答えます。この文は非常に単純ですが、この文を理解する前に、まず何をしているのかを理解する必要がありますよね?
Behとは何ですか
ハッシュは、変数/オブジェクトの属性が特定のアルゴリズムに適用された後に取得される一意の文字列であり、この文字列は変数/オブジェクトの一意性を決定するために使用されます。正しいハッシュ関数は、この基準を順守する必要があります。
ハッシュ関数が同じオブジェクトまたは等しいオブジェクトに適用される場合、各実行は同じ値を返す必要があります。言い換えれば、2つの等しいオブジェクトには同じハッシュコードが必要です。
注:すべてのJavaオブジェクトは、オブジェクトクラスからデフォルトのHashCode()メソッドを継承します。この方法は、整数としてメモリ内のアドレスを返します。
エントリークラスの1つの紹介
マップの定義は次のとおりです。マッピングキーから値へのオブジェクト。とてもシンプルですよね?
したがって、これらの重要な値のペアを保存するには、ハッシュマップに特定のメカニズムが必要です。 Make Hashmapには、このように見える内部クラスのエントリがあります。
静的クラスエントリ<k、v> entry <k、final k key <k、v>
もちろん、エントリクラスにはキー値を保存する属性があります。キーは、キーと値に加えて、次に2つの変数を見ることができます。次に、これらの変数の意味を理解しようとします。
Put()メソッドは実際に何をしますか?
PUTメソッドの実装を見る前に、アレイのエントリインスタンスのストレージを確認する必要があります。
/ ** *アソレッサリーのサイズを変更する必要があります。 /***指定された値をこのマップの指定されたキーと関連付けます。 keyに関連付けられる値key* @return </tt>に関連付けられた前の値、または* <tt> null </tt> ifterer e /tt> .*(a <tt> null </tt>また、戻りは、MAP*以前のAssociation <tt> null </tt> key </tt>。)*/public v put(k key、value){if(key == null)return putfornullkey(value); int hash = have(key.hashcode()); &&(k = e.key)== key.equals(k)){oldvalue = e.value = value; 、キー、すべて);}
段階的に見てみましょう
まず、キーがnull値の位置であるかどうかを確認します。
次に、このキーのハッシュ値は、エントリオブジェクトの配列の位置を計算するために使用されるキーハッシュコード()メソッドを介して計算されます。 JDKのデザイナーは、一部の人々が非常に貧弱なハッシュコード()メソッドを書く可能性があると想定しており、非常に大きなハッシュ値または非常に小さなハッシュ値があります。この問題を解決するために、彼らは別のハッシュ関数を導入して、オブジェクトのハッシュコード()を受け入れ、それを配列の容量に変換しました。
次は、エントリオブジェクトストレージの正確な位置を計算するIndexfor(ハッシュ、テーブル、長さ)メソッドです。
次に、2つの異なるオブジェクトが同じ位置に[バケツと呼ばれる]をどのように保存できるかを知っています。
答えはLinkedListです。覚えている場合、エントリクラスには次の変数がありますが、この変数は常にチェーン内の次の変数を指し、リンクリストの特性を完全に満たします。
したがって、衝突が発生すると、エントリオブジェクトを保存する必要があります。現在のエントリオブジェクトは、保存されているエントリオブジェクトの次のノードとして使用されます。
既存のキーを別の値に保存した場合はどうなりますか?論理的には、古い値が置き換えられます。エントリオブジェクトのストレージ位置を検出した後、HashMapはその位置にリンクされたリストを通話します。等しい方法が等しいことがわかった場合、交換は実行されます。
このようにして、ハッシュマップはキーの独自性を確保することができます。
GETメソッドの作業メカニズム
今、私たちはハッシュマップで飼育されたストレージのメカニズムを学びました。次の質問は、ハッシュマップから結果を照会する方法です。
実際、ロジックはPutと同じです。
/***このマップにキーのマッピングが含まれていない場合、このマップにはキーからのマッピングが含まれている場合、specifyキーがマッピングされる値を返します。 * {@code k} to a value {@code v} {@code(key == null?k == null:* key.equals(k)}、このメソッドは{@code v}; oを返します。 theerwise {@code null}には、キーのマッピングが含まれていません。 * 2つのケースを区別します。** @see #put(オブジェクト) ); = key ||。
上記のコードは、if(e.hash == hash &&((k = e.key)== key || key.equals(k))を除いて、put()メソッドに似ています。
注意してください