【问题标题】:Custom objects not found in HashMap?在 HashMap 中找不到自定义对象?
【发布时间】:2012-05-30 03:37:04
【问题描述】:

您好,我正在尝试学习 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?

【问题讨论】:

标签: java hashcode


【解决方案1】:

您的equals() 方法错误,这会破坏HashMapequals() 的参数始终是 Object;你必须检查它是什么类型的Object 并将其转换到方法的主体中。

hashCode() 值用于将对象分类,但equals() 用于确定两个对象是否实际上相同。您需要正确定义这两种方法才能使HashMap 工作。

【讨论】:

  • 感谢欧内斯特,现在我做对了。 }`
【解决方案2】:

你没有正确实现 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());
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2020-02-16
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多