覆盖equals和hashcode

问题描述 投票:-4回答:1

我编写了以下程序,无法理解输出。

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被覆盖的方式错了吗?任何人都可以解释我如何解决这个问题?

java equals hashcode
1个回答
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两个对象都相等:true”

如果你将e1e2的声明更改为

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

输出将是

1
Both objects are equal: false
© www.soinside.com 2019 - 2024. All rights reserved.