我想了解hashcode()
。我有2个场景
1)使用employee2类对象实现hashmap
2)用原语实现hashMap
(虽然它们不是原语)
在类对象的情况下,我理解如果我没有实现hashcode()
它每次都会生成一个随机的hashcode(),所以当我检索对象时,每次都会查看一些不同的桶并返回NULL
但是,当我不使用类对象时,为什么不在第二种情况下发生这种情况
代码如下:
package programs;
import java.util.*;
public class employee2
{
private int empid;
private String name;
private String dept;
public employee2(int empid,String name,String dept){
this.empid=empid;
this.name=name;
this.dept=dept;
}
int getEmpid(){
return this.empid;
}
@Override public boolean equals(Object o){
employee2 e=(employee2)o;
return getEmpid()==e.empid;
}
@Override public int hashCode() {
int hash = 7;
hash = 83 * hash + this.empid;
return hash;
}
@Override public String toString(){
return empid+", "+name;
}
public static void main(String args[]){
//HashMap with employee class objects
Map<employee2,String> emap=new HashMap<>();
emap.put(new employee2(98446,"Amol Singh","Science"),"good");
emap.put(new employee2(98446,"Robin Singh","Math"),"very good");
// I get null if i dont override hashcode()
System.out.println(emap.get(new employee2(98446,"Robin Singh","Math")));
// New HashMap without Class objects
Map<Integer,String> emap2=new HashMap<>();
emap2.put(23,"amol");
emap2.put(2,"Robin");
// I get correct answer without overriding hashcode()
System.out.println(emap2.get(23));
}
}
答案 0 :(得分:0)
基于散列的集合需要覆盖hashCode。
如果你不覆盖它,它们将无法正常工作。
Integer
拥有自己的hashCode
实现,因此在集合中使用它时无需执行任何操作。
但是如果要将它们放在基于散列的集合中,则必须使用您创建的类来执行此操作
答案 1 :(得分:0)
例如,如果您查看String的源代码,那么已经实现了一个非常好的哈希码算法
因此对于Wrapper类和String,永远不需要自己编写hashcode方法
答案 2 :(得分:0)
在第二种情况下 - 当您将整数值放入映射时,原始类型转换为其对应的对象包装类。这称为autoboxing。所以你的int转换为已经覆盖hashcode
和equals
方法的Integer类。看看Integer课程。
在你的第一个案例中,你已经定义了自己的课程。因此,您需要提供自己的equals
和hashcode
方法。
答案 3 :(得分:0)
我找到了这篇文章,这可能有助于解释它。
what-is-the-default-implementation-of-hashcode
据我所知,您正在创建一个新的Object来键入您的地图,JVM提供的hashCode的默认实现是将该对象视为与地图中现有对象的不同。
以下是hashfile的java doc的直接链接。 Object.hashCode()以及与此问题相关的摘要。
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数
故事的寓意是,如果您将HashSets与对象一起使用,则应始终定义自己的hashCode实现。但是有一些警告,例如,如果你使用单身人士。