我有一个程序来搜索键以打印哈希图中的值。但我对键和值的输入是用户定义的对象。现在,当我将输入key
等同于key1
为什么程序中key
和key1
对象的哈希码看起来不同,尽管返回类型相同,即。NameInit
,String str="abc"
和abc
的哈希码返回相等?如何检查程序中key
和key1
的相等性?我在类型转换后尝试Objects.equals(key,key1)
Object
类,但仍然不起作用。我见过类似的问题,比如在[这个问题][1]中讨论哈希码相等性,但又如何像我的例子一样做这些对象的相等性。请帮忙。
名称初始化类
public class NameInit {
String name;
public NameInit(String name)
{
this.name = name;
}
@Override
public String toString(){
return name;
}
}
PlaceAndAddInit
public class PlaceAndAddInit {
String place;
int value;
public PlaceAndAddInit(String place,int val) {
this.place = place;
this.value= val;
}
@Override
public String toString(){
return place+" "+value;
}
}
主类
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
HashMap h = new HashMap();
System.out.println("Limit: ");
int limit = scan.nextInt();
for(int i=0;i<limit;i++)
{
h.put(new NameInit(scan.next()), new PlaceAndAddInit(scan.next(),
scan.nextInt()));
}
System.out.println("Enter a key to search the value: ");//
NameInit key= new NameInit(scan.next());//asks for a input from the user to fetch the values
Set s = h.entrySet();
Iterator<NameInit> itr = s.iterator();
while(itr.hasNext())
{
Map.Entry<NameInit,PlaceAndAddInit> me = (Map.Entry) itr.next();
NameInit key1 =me.getKey();
if(key.equals(key1)){// this never happens with this code as key and key1 holds different hashcodes. So how do I achieve the equality.
System.out.println(me.getValue());
}
}
}
}
编辑:我试图通过
equals
方法获得平等,我发现key1
和key
的哈希码是不同的。了解这背后的原因是我提问的目的。
您不会覆盖hashCode()
因此使用默认值。在默认实现中,key
和key1
将具有不同的 hashCode 值,即使您认为它们应该相等,它们也不会相等。因此,如果您希望能够比较这些对象,解决方案是覆盖hashCode
和equals
方法。
要回答您的问题:
编辑:我试图通过平等的方法获得平等,我 发现 key1 和 key 的哈希码不同。理解 这背后的原因是我提问的目的。
如果不向equals
和hashCode
提供覆盖,它们将从Object
继承。以下是他们寻找Object
的方式:
public boolean equals(Object obj) {
return (this == obj);
}
因此,2 个对象只有在==
时才相等,这意味着它们指向完全相同的内存位置。在您的示例中,情况并非如此。hashCode
是原生的,因此无法向您显示源代码。
以下是更多要阅读的内容:
谷歌搜索关于哈希代码和等于
Objects.equals
是这样实现的:
return (a == b) || (a != null && a.equals(b));
你看,它基本上是调用a
的equals
方法,而不是hashcode
方法。无论hashcode
如何实现Objects.equals
当返回 false 时a.equals(b)
返回 false。它与hashcode
方法无关。
因此,要解决此问题,只需覆盖equals
方法即可。这是一个简单的实现:
@Override
public boolean equals(Object obj) {
return this.hashcode() == obj.hashcode();
}
另外,如果你想在哈希映射中找到键的值,在哈希映射上调用get
方法,它将在 O(1( 时间内为你完成。不需要O(n(时间的低效方法。