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

Java-当两个键映射到同一个值时返回什么?,java,map,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

在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返回什么?
它是否将ref返回到“chain”?返回“悉尼”吗?还是返回“孟买”?

据我所知,Map首先解析正确的bucket(由密钥的hashcode标识)。如果同一个bucket中有多个键,则使用equals方法在bucket中查找正确的值。

根据我的理解,Map首先解析正确的bucket(由键的hashcode标识)。如果同一个bucket中有多个键,则使用equals方法在bucket中查找正确的值。

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

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

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

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

map.get(“约翰”)
为您提供

map.get(“玛丽”)
为您提供

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

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


值得一提的是,最坏的情况是存储(K,V)对,所有对的密钥都具有相同的哈希代码。在这种情况下,您的hashmap会退化为一个链表。

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

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

map.get(“约翰”)
为您提供

map.get(“玛丽”)
为您提供

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

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


值得一提的是,最坏的情况是存储(K,V)对,所有对的密钥都具有相同的哈希代码。在这种情况下,您的hashmap将降级为一个链表。

您的键不同

首先是一些术语

  • :放置中的第一个参数
  • :放置中的第二个参数
  • 条目:同时保存键和值的
    对象
当您
放入
HashMap
时,map将调用键上的
hashCode()
,并计算出条目需要进入哪个散列桶。如果此bucket中已经有内容,则将由bucket中的条目组成一个
LinkedList

当您从一个
HashMap
get
时,映射将调用键上的
hashCode()
,并计算出从哪个hash bucket中获取条目。如果bucket中有多个条目,则映射将沿着
链接列表
移动,直到找到一个条目,其密钥
等于提供的密钥()

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

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

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

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

您的键不同

首先是一些术语

  • :放置
中的第一个参数
  • :放置
  • 中的第二个参数
  • 条目:同时保存键和值的
    对象
  • 当您
    放入
    HashMap
    时,map将调用键上的
    hashCode()
    ,并计算出条目需要进入哪个散列桶。如果此bucket中已经有内容,则将由bucket中的条目组成一个
    LinkedList

    当您从一个
    HashMap
    get
    时,映射将调用键上的
    hashCode()
    ,并计算出从哪个hash bucket中获取条目。如果bucket中有多个条目,则映射将沿着
    链接列表
    移动,直到找到一个条目,其密钥
    等于提供的密钥()

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

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

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

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

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

    查看您的示例,让您感到困惑的是,您认为值是为给定的k链接的