您好我正在尝试学习hashcode()和equals()方法的目的。我尝试了以下程序。
import java.util.HashMap;
public class LearnHascode {
public String name;
public int age;
LearnHascode(String na)
{
name = na;
}
public int hashCode()
{
return name.hashCode();
}
public boolean equals(LearnHascode obj)
{
return this.name.equals(obj.name);
}
public static void main(String[] args)
{
HashMap h = new HashMap();
LearnHascode ob1 = new LearnHascode("Prabha");
LearnHascode ob2 = new LearnHascode("Prabha");
h.put(ob1, v1);
h.put(ob2, v2);
System.out.println(h);
System.(h.out.printlncontainsKey(new LearnHascode("Prabha")));
}
}
输出:
{hash.LearnHascode@8ef7bdfc=Two, hash.LearnHascode@8ef7bdfc=one}
false
我有两个疑问:
1)我认为HashMap将包含一个条目,因为两个对象(ob1和ob2)的hascode是相同的。任何人都可以解释为什么HashMap中有两个条目?
2)为什么System.(h.out.printlncontainsKey(new LearnHascode("Prabha")));
返回false?
答案 0 :(得分:7)
您的equals()
方法错误,这会破坏HashMap
。 equals()
的参数始终为Object
;你必须检查它是什么类型Object
并将其投射到方法的主体中。
hashCode()
值用于将对象排序为类别,但equals()
用于确定两个对象实际上是否相同。您需要正确定义这两种方法才能使HashMap
起作用。
答案 1 :(得分:0)
你没有正确实现hashCode()和equals()方法。
公共类员工{
private int empId;
private String empName;
public Employee(int id, String name){
empId = id;
empName = name;
}
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int hashCode(){
System.out.println("In Hash Code");
int hashCode = 20;
hashCode *= this.empId;
hashCode += this.empName.hashCode();
return hashCode;
}
public boolean equals(Object obj){
System.out.println("In equals");
if(!(obj instanceof Employee)){
return false;
}
Employee emp = (Employee) obj;
return (emp.getEmpName().equals(this.getEmpName())) && (emp.getEmpId() == this.getEmpId());
}
}