1

在 Java 中,我理解如果两个键映射到一个值,则会由于冲突而发生线性链接。

例如:

    Map myMap= new HashMap();   //Lets says both of them get mapped to same bucket-A and
    myMap.put("John", "Sydney");//linear chaining has occured.
    myMap.put("Mary","Mumbai"); //{key1=John}--->[val1=Sydney]--->[val2=Mumbai]

所以当我这样做时:

myMap.get("John");   // or myMap.get("Mary")

由于 bucket-A 包含两个值,JVM 会返回什么?它是否将参考返回到“链”?它会返回“悉尼”吗?还是返回“孟买”?

4

5 回答 5

5

当您的键具有相同的哈希码而不是当两个键映射到一个值时,就会发生线性链接。

所以当我这样做时: myMap.get("John"); // 或 myMap.get("Mary")

map.get("John")给你悉尼

map.get("Mary")给你孟买

由于 bucket-A 包含两个值,JVM 会返回什么?

如果同一个桶包含两个值,则equals使用键的方法来确定要返回的正确值。

值得一提的是存储 (K,V) 对的最坏情况,它们的 Key 都具有相同的 hashCode。在这种情况下,您的哈希图会降级为链表。

于 2013-03-07T16:43:52.060 回答
3

您的hashCode方法的 确定将放入哪个“桶”(又名列表,又名“线性链”)。该equals方法确定在发生碰撞时实际从“桶”中拾取哪个对象。这就是为什么在您打算存储在任何类型的哈希映射中的所有对象上正确实现这两种方法很重要的原因。

于 2013-03-07T16:43:43.920 回答
1

你的钥匙不一样。

首先是一些术语

  • key : 中的第一个参数put
  • value : 中的第二个参数put
  • entry : 一个Object同时包含键和值的

当您put进入HashMap地图时,将调用hashCode()密钥并计算出条目需要进入哪个哈希桶。如果这个桶中已经有东西,那么 aLinkedList由桶中的条目组成。

当您getHashMap地图中调用hashCode()密钥并计算出从哪个哈希桶获取条目时。如果存储桶中有多个条目,则地图将沿着该LinkedList条目移动,直到找到具有equals()该键提供的键的条目。

映射将始终返回Object与该键绑定的条目,即条目中的值。hashCode()如果为不同的键返回相同(或相似)的值,则映射性能会迅速下降。

您需要使用 java 泛型,因此您的代码应该真正阅读

Map<String, String> myMap = new HashMap<String, String>();

这将告诉地图您希望它存储String键和值。

于 2013-03-07T16:48:05.167 回答
0

据我了解,地图首先解析正确的存储桶(由密钥的哈希码标识)。如果同一个bucket中有多个key,则使用equals方法在bucket中找到正确的值。

于 2013-03-07T16:43:36.183 回答
0

查看您的示例,您感到困惑的是,您认为值是针对给定键链接的。实际上Map.Entry对象是针对给定的哈希码链接的。键的 hashCode 为您提供了 bucked,然后您查看链接的条目以找到具有相等键的条目。

于 2013-03-07T16:57:04.227 回答