Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 对用户类Employee使用HashSet_Java_Set_Equals_Hashcode_Hashset - Fatal编程技术网

Java 对用户类Employee使用HashSet

Java 对用户类Employee使用HashSet,java,set,equals,hashcode,hashset,Java,Set,Equals,Hashcode,Hashset,我知道这听起来是一个非常愚蠢的问题,但在我了解了HashSet以及我在执行下面的代码时看到的内容之后,我感到困惑 我有一个Employee类,如下所示(只保留相关代码): 现在我有以下代码,它使用了HashSet: Employee e1 = new Employee("Abc", 2.0, 1); Employee e2 = new Employee("abc", 3.0, 4); Employee e3 = new Employee("XYZ", 4.0, 3); Employee e

我知道这听起来是一个非常愚蠢的问题,但在我了解了
HashSet
以及我在执行下面的代码时看到的内容之后,我感到困惑

我有一个Employee类,如下所示(只保留相关代码):

现在我有以下代码,它使用了
HashSet

Employee e1  = new Employee("Abc", 2.0, 1);
Employee e2  = new Employee("abc", 3.0, 4);
Employee e3  = new Employee("XYZ", 4.0, 3);
Employee e4  = new Employee("Mno", 5.0, 2);
Employee e5  = new Employee("Abc", 77.0, 1);

Set<Employee> sEmp = new HashSet<Employee>();
sEmp.add(e1);
sEmp.add(e2);
sEmp.add(e3);
sEmp.add(e4);
sEmp.add(e5);

for(Employee e : sEmp){
    System.out.println(e);
}
好的,集合不允许重复,并且此重复将在
等于
时进行检查(如果我错了,请纠正我)

另外,
HashSet
使用
hashCode
,因此在上述情况下,不应添加对象
e5
。但它成功地将该元素添加到集合中。这让我很困惑

(如果我错过了标准和所有这些东西,请忽略,我正在努力理解概念/实现)


已编辑:这听起来可能是个愚蠢的问题,但我正在准备认证,我正在尝试了解这些东西是如何工作的。

您正在重载
等于
,而不是覆盖它。其参数的类型应为
对象


但是您的
hashCode
正在检查
id
,而
equals
正在检查
name
。它们可能应该由相同的属性构造。

这是一个标准示例,说明了为什么我们应该尽可能使用
@Override
注释

如果将此注释与
equals
方法一起使用,编译器将通知您没有重写
equals
方法,因为超类中没有
equals(Employe)
方法,而是
equals(Object)
。因此,您正在重载此方法(您正在创建具有不同参数的附加方法)

由于此哈希集不使用
equals
方法的代码,而是使用继承自
Object
类的
equals(Object)
方法的代码,该类仅检查引用的相等性:

public boolean equals(Object obj) {
    return (this == obj);
}

我在equals方法中添加了更多的代码。这将允许您更新员工id的最新值

package com.test.day16;

import java.util.HashSet;
import java.util.Set;

/**
 * 
 * @author PradeepPadmarajaiah
 *
 */
public class Employee {

    private int empId;
    private String empName;

    public Employee(int empId, String empName) {
        super();
        this.empId = empId;
        this.empName = empName;
    }

    /**
     * @return the empId
     */
    public final int getEmpId() {
        return empId;
    }

    /**
     * @param empId
     *            the empId to set
     */
    public final void setEmpId(int empId) {
        this.empId = empId;
    }

    /**
     * @return the empName
     */
    public final String getEmpName() {
        return empName;
    }

    /**
     * @param empName
     *            the empName to set
     */
    public final void setEmpName(String empName) {
        this.empName = empName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName + "]";
    }

    @Override
    public int hashCode() {
        return this.empId;
    }

    @Override
    public boolean equals(Object obj) {
        Employee employee = (Employee) obj;
        if (employee.empId == this.empId) {
            employee.setEmpName(this.empName);
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        Set<Employee> employees = new HashSet<>();
        employees.add(new Employee(1, "Raj"));
        employees.add(new Employee(1, "Pradeep"));
        employees.add(new Employee(1, "Kumar"));
        employees.add(new Employee(2, "Chandan"));
        employees.add(new Employee(2, "Amitava"));

        System.out.println(employees);
    }
}
package com.test.day16;
导入java.util.HashSet;
导入java.util.Set;
/**
* 
*@作者PradeepPadmarajaiah
*
*/
公营雇员{
私有内部empId;
私有字符串名称;
公共雇员(int-empId,字符串empName){
超级();
this.empId=empId;
this.empName=empName;
}
/**
*@returntheempid
*/
公共最终int getEmpId(){
返回empId;
}
/**
*@param empId
*要设置的empId
*/
公共最终无效setEmpId(int-empId){
this.empId=empId;
}
/**
*@returntheempname
*/
公共最终字符串getEmpName(){
返回empName;
}
/**
*@param empName
*要设置的名称
*/
公共最终void setEmpName(字符串empName){
this.empName=empName;
}
/*
*(非Javadoc)
* 
*@see java.lang.Object#toString()
*/
@凌驾
公共字符串toString(){
返回“Employee[empId=“+empId+”,empName=“+empName+”]”;
}
@凌驾
公共int hashCode(){
返回此.empId;
}
@凌驾
公共布尔等于(对象obj){
员工=(员工)obj;
if(employee.empId==this.empId){
employee.setEmpName(this.empName);
返回true;
}否则{
返回false;
}
}
公共静态void main(字符串[]args){
Set employees=new HashSet();
新增(新员工(1,“Raj”);
新增(新员工(1名,“Pradeep”);
新增(新员工(1名,“库马尔”);
新增(新员工(2名,“Chandan”);
新增(新员工(2名,“阿米塔瓦”);
系统输出打印LN(员工);
}
}
选中行“employee.setEmpName(this.empName);”这将覆盖id的值。这意味着,empId 1的最新empName值为Kumar 否则,empId 1的empName值将为第一次分配的Raj,并且在检查后不会将该值覆盖到Kumar 这项工作类似于HashMap机制

代码结果将为
[Employee[empId=1,empName=Kumar],Employee[empId=2,empName=Amitava]]

来自Collection javadoc页面。“实现可以自由实现优化,从而避免equals调用,例如,首先比较两个元素的哈希代码。”@Abubakkar Rangara您可以提供员工构造函数代码吗also@MSach这很简单,但我从下面得到了答案,这是我这边的愚蠢错误。
public boolean equals(Object obj) {
    return (this == obj);
}
package com.test.day16;

import java.util.HashSet;
import java.util.Set;

/**
 * 
 * @author PradeepPadmarajaiah
 *
 */
public class Employee {

    private int empId;
    private String empName;

    public Employee(int empId, String empName) {
        super();
        this.empId = empId;
        this.empName = empName;
    }

    /**
     * @return the empId
     */
    public final int getEmpId() {
        return empId;
    }

    /**
     * @param empId
     *            the empId to set
     */
    public final void setEmpId(int empId) {
        this.empId = empId;
    }

    /**
     * @return the empName
     */
    public final String getEmpName() {
        return empName;
    }

    /**
     * @param empName
     *            the empName to set
     */
    public final void setEmpName(String empName) {
        this.empName = empName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName + "]";
    }

    @Override
    public int hashCode() {
        return this.empId;
    }

    @Override
    public boolean equals(Object obj) {
        Employee employee = (Employee) obj;
        if (employee.empId == this.empId) {
            employee.setEmpName(this.empName);
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        Set<Employee> employees = new HashSet<>();
        employees.add(new Employee(1, "Raj"));
        employees.add(new Employee(1, "Pradeep"));
        employees.add(new Employee(1, "Kumar"));
        employees.add(new Employee(2, "Chandan"));
        employees.add(new Employee(2, "Amitava"));

        System.out.println(employees);
    }
}