对于两个相同类型的用户定义对象,哈希代码显示不同



我有一个程序来搜索键以打印哈希图中的值。但我对键和值的输入是用户定义的对象。现在,当我将输入key等同于key1为什么程序中keykey1对象的哈希码看起来不同,尽管返回类型相同,即。NameInitString str="abc"abc的哈希码返回相等?如何检查程序中keykey1的相等性?我在类型转换后尝试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方法获得平等,我发现key1key的哈希码是不同的。了解这背后的原因是我提问的目的。

您不会覆盖hashCode()因此使用默认值。在默认实现中,keykey1将具有不同的 hashCode 值,即使您认为它们应该相等,它们也不会相等。因此,如果您希望能够比较这些对象,解决方案是覆盖hashCodeequals方法。

要回答您的问题:

编辑:我试图通过平等的方法获得平等,我 发现 key1 和 key 的哈希码不同。理解 这背后的原因是我提问的目的。

如果不向equalshashCode提供覆盖,它们将从Object继承。以下是他们寻找Object的方式:

public boolean equals(Object obj) {
return (this == obj);
}

因此,2 个对象只有在==时才相等,这意味着它们指向完全相同的内存位置。在您的示例中,情况并非如此。hashCode是原生的,因此无法向您显示源代码。

以下是更多要阅读的内容:

谷歌搜索关于哈希代码和等于

Objects.equals

是这样实现的:

return (a == b) || (a != null && a.equals(b));

你看,它基本上是调用aequals方法,而不是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(时间的低效方法。

相关内容

  • 没有找到相关文章

最新更新