Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashmap中重复键的检索_Java - Fatal编程技术网

Java hashmap中重复键的检索

Java hashmap中重复键的检索,java,Java,因为复制键会覆盖hashmap中的前一个键及其对应值。但如果我调用get()方法并提供previous key作为参数,它将返回重写的值。如何可能,因为该键被新键覆盖,所以它应该引发异常 //This class is used as a key Class MapKey { public boolean equlas( Object o) { return true; } } //This is test class class MapTest { public st

因为复制键会覆盖hashmap中的前一个键及其对应值。但如果我调用get()方法并提供previous key作为参数,它将返回重写的值。如何可能,因为该键被新键覆盖,所以它应该引发异常

//This class is used as a key
Class MapKey
{
  public boolean equlas( Object o)
  {
    return true;
  }
}

//This is test class
class MapTest
{
  public static void main(String a[])
  {
    Map m=new Hashmap<Mapkey, String>();
    MapKey mk1=new MapKey();
    m.put(mk1,"one");

    MapKey mk2=new MapKey();
    m.put(mk2,"two");

    MapKey mk3=new MapKey();
    m.put(mk3,"three");

    System.out.println(m.get(mk1));
    System.out.println(m.get(mk2));
  }
}
//该类用作密钥
类映射键
{
公共布尔等式(对象o)
{
返回true;
}
}
//这是考试班
类映射测试
{
公共静态void main(字符串a[]
{
Map m=新的Hashmap();
MapKey mk1=新的MapKey();
m、 put(mk1,“一”);
MapKey mk2=新的MapKey();
m、 put(mk2,“两”);
MapKey mk3=新的MapKey();
m、 put(mk3,“三”);
系统输出println(m.get(mk1));
系统输出println(m.get(mk2));
}
}
产出:三 三

因为键是相等的,所以它应该被最后一个键对象mk3覆盖。 那个么,如何使用第一个或第二个键对象检索值呢


提前感谢对于
HashMap
equals
方法不是最重要的。顾名思义,将值插入
HashMap
的最重要方法是
hashCode
,而不是
等于
。只有当映射中的键
k
满足以下条件时,才会在
HashMap
中覆盖值:
k.hashCode()
等于插入项的键的hashCode,并且键等于
k
,这是因为您没有覆盖hashCode方法。在equals方法中,您已声明所有对象都是相等的。但是由于默认的hashcode实现,所有相同的对象都返回不同的hashcode。由于hashcodes用于在hashmap中保存值,因此您可以获取旧键mk1和mk2的值。

您发布的代码没有提供

three 
three 
即使我修复它以清除编译错误:

import java.util.*;

class MapKey
{
  public boolean equlas( Object o)
  {
    return true;
  }
}

class MapTest
{
  public static void main(String a[])
  {
    Map<MapKey, String> m=new HashMap<MapKey, String>();
    MapKey mk1=new MapKey();
    m.put(mk1,"one");

    MapKey mk2=new MapKey();
    m.put(mk2,"two");

    MapKey mk3=new MapKey();
    m.put(mk3,"three");

    System.out.println(m.get(mk1));
    System.out.println(m.get(mk2));
  }
}
即使我将MapKey修复为覆盖等于:

class MapKey
{
  public boolean equlas( Object o)
  {
    return true;
  }

  public boolean equals( Object o)
  {
    return true;
  }
}
这将打印相同的输出

如果我实现hashCode:

class MapKey
{
  public int hashCode()
  {
    return 1;
  }

  public boolean equals( Object o)
  {
    return true;
  }
}
然后打印出来

three
three
hashCode和equals的默认实现基于对象引用,对不同对象的引用将不相等。映射使用hashCode来决定将对象存储在哪个bucket中,并使用equals来区分同一bucket中的不同对象


在这里,您创建了三个不同的实例,因此它们的哈希代码将不同(只要没有冲突,在这种情况下,将调用equals方法来确定这两个对象是否相同)。在这种情况下,不会发生冲突,直到hashCode被覆盖,不同的mapKey实例才会被视为等效实例。

您应该为您打算在
HashMap
中使用的任何类实现
hashCode
。并且
Equalas
中存在键入错误,不是覆盖,也不是比较任何内容,只是返回true。请给我们实际编译的代码<例如,code>Class、
Equalas
Hashmap
是不正确的。还要注意的是,
Hashmap.get
不会在键不存在时引发异常。它返回
null
。我投票决定结束,因为我无法重现这个结果。我试过你的代码,但没有纠正错误,我没有得到你报告的结果。首先,非常抱歉键入错误…你把代码纠正了,这就是我想问的。我的问题是,如果我们像您那样重写hashCode()和equals()方法,那么正如hashMap的实现所表明的那样,当我们插入与前一个重复的新键时,前一个键就会被新键重写。所以,如果在上述情况下它被重写,那么如何通过使用前一个键(在上面的示例中使用MapKey类的第一个或第二个引用)从map中检索值。我有意重写equals和hashCode方法,每次都给出相同的值。因为我想检查hashMap在重复密钥插入情况下的行为。正如文档所建议的,在重复插入密钥的情况下,会替换上一个键值对。如果它是正确的,那么在上面的示例中插入三个相同的键之后,如何能够使用第一个键(mk1或mk2)获取值,因为它现在不再存在于hashMap中。它被第三个键替换,即mk3。如果不同的键从equals和hashCode返回相同的结果,那么键对象是等效的,您无法获得不同的值。您发布的代码未显示此行为,因为Object@hashCode对不同的对象给出不同的结果。还要注意的是,你必须小心避免发帖时出现编码错误,因为与发帖时引入的一些无关的打字错误相比,回答者很难知道什么是根本问题。您可以编辑问题并修复打字错误。
three
three