覆盖equals和hashcode

时间:2017-12-14 04:24:47

标签: 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)
    {
        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));
    }
}

输出:2 两个对象都是相同的:true

我已覆盖equalshashcode,因此Map应该只存储一个对象。但它似乎存储了它们。 equalshashcode被覆盖的方式是错误的吗?任何人都可以解释我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

首先阅读here

的基础知识

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

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

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

在上面三行中,您尝试使用不同的键(1和2)存储两个元素。所以你得到输出 “2两个对象都是平等的:真的”

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

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

在这种情况下,第二次放置会将第一个值e1替换为e2。但是当你将equals重写为比较empName字段时,它会将输出显示为“1两个对象都相等:为真”

如果您将e1e2的声明更改为

Emp e1 = new Emp(1,"Stack One");
Emp e2 = new Emp(1,"Stack Two");

输出

1
Both objects are equal: false