【发布时间】:2016-06-13 04:38:28
【问题描述】:
我想了解hashcode()。我有两个场景
1) 使用employee2 类对象实现hashmap
2) 使用原语实现hashMap(尽管它们不是原语)
如果是类对象,我知道如果我不实现hashcode(),它每次都会生成一个随机哈希码(),所以当我检索对象时,它每次都会查看一些不同的存储桶并返回空
但是当我不使用类对象时,为什么在第二种情况下不会发生这种情况
代码如下:
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));
}
}
【问题讨论】:
-
Integer使用原语int的值作为哈希码。 -
如果你看一下 Integer 类的源代码,它也实现了自己的 hashcode 方法。
-
@zombie 所以 Integer 的
hashcode值是 int 的值,对吗? -
@Amol 查看 Integer 类 grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… 的源代码,并寻找 hashcode 实现以便更好地理解。
-
@zombie ... 是的,它返回哈希码作为 int 的值 ..但是由于哈希码是指条目对象的表数组的索引,所以如果 int 更大,那不会是性能问题说1000