对于相同类型的两个用户定义的对象,哈希码看起来是不同的

时间:2017-07-12 09:37:01

标签: java hashmap hashcode

我有一个程序来搜索键以从hashmap中打印值。但是我对Key和Values的输入是用户定义的对象。现在,当我将输入keykey1等同时,为什么对象key和{{1}的哈希码是什么?在程序中出现的不同,虽然返回类型相同,即。 key1NameInitString str="abc"的哈希码是否相等?如何检查程序中abckey的相等性?我在类型转换为key1类后尝试了Objects.equals(key,key1),但仍然没有工作。我在[本问题] [1]中看到类似的问题,讨论了哈希码的相等性,但随后再次如何在我的例子中做这些对象的相等性。请帮助。     
NameInit 班级

Object

PlaceAndAddInit

public class NameInit {
String name;
public NameInit(String name)
 {
  this.name = name;
  }
  @Override
  public String toString(){
  return name;
  }    
}

主要类

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()); } } } } 方法获得相等性,我发现equalskey1的哈希码不同。理解这背后的原因是我的问题的目的。

2 个答案:

答案 0 :(得分:0)

Objects.equals的实现方式如下:

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

你知道,它基本上是调用a的{​​{1}}方法, 不是 equals方法。无论hashcode如何实现,hashcodeObjects.equals返回false时返回false。它与a.equals(b)方法无关。

因此,要解决此问题,只需覆盖hashcode方法即可。这是一个简单的实现:

equals

此外,如果要在哈希映射中查找键的值,请在哈希映射上调用@Override public boolean equals(Object obj) { return this.hashcode() == obj.hashcode(); } 方法,它将在O(1)时间内为您执行此操作。 O(n)时间不需要这种效率低下的方法。

答案 1 :(得分:0)

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

回答你的问题:

  

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

如果您未向equalshashCode提供替换,则会从Object继承。以下是他们寻找Object的方式:

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

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

以下是阅读内容:

Google search about hashCode and equals