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);
}
}