快速提问以确保我很好地理解了 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)
第二个也是一样。
- 将其存储在同一个存储桶中,但由于此时这是一个 LinkedList,我想将其存储在“下一个可用分配”中。
为拿到它,为实现它:
- 拿起钥匙,获取哈希码,
- 看水桶,
- 然后查看 LinkedList 中第一个元素的键,
- 然后检查键是否传递和元素中的键匹配,如果不匹配,则继续下一个,依此类推,直到可以检索到值。
我是否正确理解了这个概念?
非常感谢!
编辑:
非常感谢,所以完成: - Java HashMap 如何在内部存储条目 - Java HashMap 如何处理具有相同哈希码的不同对象?
和:
- 不应该有那么多“桶”
- 存储桶与条目不同。存储桶是共享同一存储桶#的所有条目的逻辑集合(在 Java 案例中是键的 hashCode() 的函数)。如其他答案所述,桶溢出可以通过多种方式实现,不一定在列表中。
- 还有其他现有的冲突解决方案:http ://en.wikipedia.org/wiki/Hash_table#Collision_resolution
- 它使用 Object 的 equals 方法来比较和检索同一存储桶中的对象。