JavaのHashMapがどのように機能するかをよく理解していることを確認するための簡単な質問。
コードの例を次に示します。
//String key = new String("key");
//String val = new String("value");
String key = "key";
String val = "value";
HashMap map = new HashMap();
map.put(key, val);
System.out.println("hashmap object created. Its key hashcode = "+key.hashCode());
// the hashcode is 106079
System.out.println("hashmap object value for key = "+map.get(key));
// Let's store using a key with same hashcode
Integer intkey = new Integer(106079);
val = "value2";
map.put(intkey, val);
System.out.println("hashmap object created. Its intkey hashcode = "+intkey.hashCode());
// this returns 106079 once again. So both key and intkey have the same hashcode
// Let's get the values
System.out.println("hashmap object value for intkey = "+map.get(intkey));
System.out.println("hashmap object value for key = "+map.get(key));
返される値は期待どおりです。舞台裏では、HashMap は次のように機能することを読みました。
- キー/値を取得します。
- キーからハッシュコードを作成します。
- キーと値のオブジェクトをバケットに保存します (私の場合、バケット番号 106079)
2番目のものについても同じです。
- 同じバケット内に保存しますが、これはこの時点で LinkedList であるため、「次に利用可能な割り当て」に保存すると思います。
それを取得するには:
- キーを取得し、ハッシュコードを取得し、
- バケツを見て、
- 次に、LinkedList の最初の要素のキーを見て、
- 次に、渡されたキーと要素からのキーが一致するかどうかを確認し、一致しない場合は次のように値を取得できるまで続けます。
この概念を正しく理解していますか?
どうもありがとう!
編集:
- Java HashMap はエントリを内部的にどのように保存するのですか? - Java HashMap は同じハッシュ コードを持つ異なるオブジェクトをどのように処理しますか?
と:
- それほど多くの「バケツ」があるべきではありません
- バケットはエントリと同じではありません。バケットは、同じバケットを共有するすべてのエントリの論理的なコレクションです# (Java の場合は、キーの hashCode() の関数です)。他の回答で述べたように、バケット オーバーフローは、必ずしもリストではなく、いくつかの方法で実装できます。
- 他の既存の衝突解決があります: http://en.wikipedia.org/wiki/Hash_table#Collision_resolution
- オブジェクトの equals メソッドを使用して、同じバケットからオブジェクトを比較および取得します。