Java - 当两个键映射到相同值时返回什么?

时间:2013-03-07 16:39:16

标签: java map

在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返回什么? 它是否将引用返回“链”?它会回归“悉尼”吗?还是回归“孟买”?

5 个答案:

答案 0 :(得分:5)

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

  

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

map.get("John")为您提供悉尼

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

  

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

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

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

答案 1 :(得分:3)

你的方法的hashCode确定它将放入什么'桶'(又名列表,又称'线性链')。equals方法确定实际从哪个对象中挑选出来的'桶',在碰撞的情况下。这就是为什么在您打算存储在任何类型的哈希映射中的所有对象上正确实现这两种方法的重要性。

答案 2 :(得分:1)

你的钥匙不同。

首先是一些术语

  • put
  • 中的第一个参数
  • put
  • 中的第二个参数
  • 条目Object同时拥有密钥和&价值

当您put进入HashMap时,地图会在密钥上调用hashCode()并找出条目需要进入的哈希桶。如果此存储桶中已存在某些内容,则表示存储区中的条目LinkedList

get来自HashMap时,地图会在密钥上调用hashCode()并找出要从中获取条目的哈希桶。如果存储桶中有多个条目,则地图将沿LinkedList移动,直到找到带有equals()密钥提供的密钥的条目。

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

看看你的例子让你感到困惑的是你认为值是为给定键链接的。事实上,Map.Entry个对象被链接到给定的哈希码。键的hashCode为你提供了反响,然后你看链接的条目来找到具有相同键的那个。