Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在HashMap中找不到自定义对象?_Java_Hashcode - Fatal编程技术网

Java 在HashMap中找不到自定义对象?

Java 在HashMap中找不到自定义对象?,java,hashcode,Java,Hashcode,大家好,我正在学习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(Learn

大家好,我正在学习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.printlnacontainskey(新的LearnHascode(“Prabha”))
返回false?

您的
equals()
方法错误,这会破坏
HashMap
equals()
的参数始终是
对象
;您必须检查对象的类型,并将其强制转换到方法体中

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

您的
equals()
方法错误,这会中断
HashMap
equals()
的参数始终是
对象
;您必须检查对象的类型,并将其强制转换到方法体中


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

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

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

}
equals()
对象
作为参数。
HashMap
从未调用过
equals(LearnHascode)
方法。
equals()
的可能副本将
对象
作为参数。
equals(LearnHascode)
方法从来没有被
HashMap
调用过。感谢Ernest的可能副本现在我搞定了。}`谢谢欧内斯特,现在我说对了`