Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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 重写equals和hashcode_Java_Equals_Hashcode - Fatal编程技术网

Java 重写equals和hashcode

Java 重写equals和hashcode,java,equals,hashcode,Java,Equals,Hashcode,我已经写了下面的程序,无法理解输出 package com.demo.strings; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; class Emp { private int empNo; private String empName; public Emp(int empno, String empname)

我已经写了下面的程序,无法理解输出

package com.demo.strings;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Emp
{
    private int empNo;
    private String empName;
    public Emp(int empno, String empname)
    {
        this.empNo=empno;
        this.empName=empname;
    }
    public int getEmpNo() {
        return empNo;
    }
    public void setEmpNo(int empNo) {
        this.empNo = empNo;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public boolean equals(Object obj)
    {
        if(obj != null && obj instanceof Emp)
        {
            String name = ((Emp)obj).getEmpName();
            if(name.equals(this.getEmpName()))
            {
                return true;
            }
        }
        return false;
    }
    public int hashcode()
    {
        return (this.hashCode()+1);
    }
}

public class StringDemo {

    public static void main(String[] args) {
        Emp e1 = new Emp(1,"Stack");
        Emp e2 = new Emp(1,"Stack");

        Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();

        empMap.put(1,e1);
        empMap.put(2,e2);


        System.out.println(empMap.size());
        System.out.println("Both objects are equal: "+e1.equals(e2));
    }
}
package com.demo.strings;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.Set;
类电磁脉冲
{
私人内特恩普诺;
私有字符串名称;
公共Emp(int-empno,String-empname)
{
这个.empNo=empNo;
this.empName=empName;
}
public int getEmpNo(){
返回empNo;
}
公共无效setEmpNo(int empNo){
this.empNo=empNo;
}
公共字符串getEmpName(){
返回empName;
}
public void setEmpName(字符串empName){
this.empName=empName;
}
公共布尔等于(对象obj)
{
if(obj!=null&&obj Emp实例)
{
字符串名称=((Emp)obj).getEmpName();
if(name.equals(this.getEmpName()))
{
返回true;
}
}
返回false;
}
公共int hashcode()
{
返回(this.hashCode()+1);
}
}
公共类StringDemo{
公共静态void main(字符串[]args){
Emp e1=新Emp(1,“堆栈”);
Emp e2=新Emp(1,“堆栈”);
Map empMap=newhashmap();
empMap.put(1,e1);
empMap.put(2,e2);
System.out.println(empMap.size());
System.out.println(“两个对象都相等:+e1.equals(e2));
}
}
产出:2 两个对象都相等:true

//Try this
Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();

empMap.put(1,e1);
empMap.put(1,e2);
我已经重写了
equals
hashcode
,因此
映射应该只在其中存储一个对象。但它似乎同时存储了这两种数据。
equals
hashcode
被重写的方式是否错误?有人能告诉我如何解决这个问题吗?

首先阅读

您正在使用HashMap。它只存储一个唯一的密钥

    Map<Integer,Emp> empMap = new HashMap<Integer,Emp>();

    empMap.put(1,e1);
    empMap.put(2,e2);
输出将是

1
Both objects are equal: false

可能的重复项您确定
hashcode()
不会抛出
StackOverflowError
?它会无限循环,这是我的错。我想我已经添加了empMap.put(1,e1);empMap.put(1,e2);非常感谢阿披实
1
Both objects are equal: false