java - Hashmap 及其背后的工作原理

标签 java linked-list hashmap

<分区>

快速提问以确保我很好地理解 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 的工作方式如下:

  1. 获取键/值。
  2. 根据 key 生成哈希码。
  3. 将键和值对象存储在桶中(在我的例子中,桶号为 106079)

第二个也是一样。

  1. 将它存储在同一个桶中,但由于此时这是一个 LinkedList,我想将它存储在“下一个可用分配”中。

获取方式:

  1. 拿起 key ,获取哈希码,
  2. 看看水桶,
  3. 然后查看 LinkedList 中第一个元素的键,
  4. 然后检查传递的键和元素中的键是否匹配,如果不匹配则继续下一个,依此类推直到可以检索到值。

我对这个概念的理解是否正确?

非常感谢!

编辑:

非常感谢,所以要完成: - How does Java HashMap store entries internally - How does a Java HashMap handle different objects with the same hash code?

和:

  • 不应该有那么多“桶”
  • 桶与条目不同。桶是共享同一个桶#的所有条目的逻辑集合(在 Java 的情况下是键的 hashCode() 的函数)。正如其他答案中所述,桶溢出可以通过多种方式实现,不一定在列表中。
  • 还有其他现有的冲突解决方案:http://en.wikipedia.org/wiki/Hash_table#Collision_resolution
  • 它使用 Object 的 equals 方法比较和检索同一桶中的对象。

最佳答案

另请注意,HashMap 可以通过多种方式实现哈希码 collision resolution ,不仅像你提到的那样使用链表

Java 的 HashMap 实现不仅使用 LinkedList 策略来处理具有相同 key.hashCode() 值的键值。

此外,您可能还想阅读 this文章

关于java - Hashmap 及其背后的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19644626/

相关文章:

java - 使用 java Collections 获得意想不到的结果

java - 及时查找添加到 Guava LinkedHashMultimap/HashMultiMap 的第一个和最后一个元素

java - 不断向文件中写入数据

java - 指定Java内存分配池地址

java - 适用于 Android、iOS 和黑莓的 Codenameone 应用内计费

c - 反向双链表

c++ - 如何将深拷贝构造函数实现到链表中?

java - ArrayList 的 HashMap 导致 nullpointerException

java - 从另一个 Controller JavaFx调用方法

c++ - 高效获取 C++ 链表中最大的 3 个整数(未排序)