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