我创建了一个包含3个参数的Employee类。
要求:根据名称进行搜索。这是所有员工都有唯一名称的情况。它必须使用key作为id添加对象。在极少数情况下,需要根据名称进行搜索。
我做了什么:
在课程中,我重写了hashCode和Equals方法。
我将这些对象的列表添加到hashmap中,其id为key,值为Employee对象
但是在添加或搜索散列图时,这两种方法都不会被调用
那么这些方法在hasmap方面的用途是什么?
员工类
public class Employee {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int hashCode() {
return name.hashCode();
}
public boolean equals(Employee emp) {
if (emp == null)
return false;
else if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
}
主要方法:
public class HashMapTest {
public static void main(String[] args) {
Employee emp1=new Employee();
emp1.setId(1);
emp1.setName("Maclean");
emp1.setAge(24);
Employee emp2=new Employee();
emp2.setId(2);
emp2.setName("Sampath");
emp2.setAge(25);
Employee emp3=new Employee();
emp3.setId(3);
emp3.setName("Achar");
emp3.setAge(27);
Employee emp4=new Employee();
emp4.setId(4);
emp4.setName("Sudheer");
emp4.setAge(25);
Employee emp5=new Employee();
emp5.setId(5);
emp5.setName("Kunder");
emp5.setAge(25);
HashMap<Integer, Employee> empmap=new HashMap();
empmap.put(emp1.getId(), emp1);
empmap.put(emp2.getId(), emp2);
empmap.put(emp3.getId(), emp3);
empmap.put(emp4.getId(), emp4);
empmap.put(emp5.getId(), emp5);
Employee emp=new Employee();
emp.setName("Maclean");
System.out.println(empmap.containsValue(emp));
System.exit(1);
}
}
更新解决方案:
感谢所有答案。
1。只有当Key是一个对象并且该方法存在于Key Class
中时,才会调用hashCode方法2。 Equals(Employee emp)导致函数重载而不是覆盖。我应该使用equals(Object o)
解决问题的代码更改
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (!(o instanceof Employee))
return false;
Employee emp = (Employee) o;
if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
答案 0 :(得分:2)
您没有覆盖您需要执行的Object.equals(Object o)。你正在超载它。这就是它没有被召唤的原因。
请尝试使用此等于():
public boolean equals(Object o) {
if (o == null)
return false;
if (!(o instanceof Employee))
return false;
Employee emp = (Employee) o;
if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
答案 1 :(得分:2)
在课程中,我重写了hashCode和Equals方法。 [...] 但是在添加或搜索散列映射时,两个方法都不会被调用 那么这些方法在hasmap方面的用途是什么?
如果您有Map<Key, Value>
,并在该地图上致电put
或get
,则会在{{1}上调用hashCode
和equals
}}类,而不是Key
类。
在您的情况下,这意味着如果您执行Value
,那么它会检查empmap.put(emp1.getId(), emp1);
的哈希以及是否已经在地图中。因此,emp1.getId()
类不会调用这些方法,这是正常的。
此外,如果Employee
是&#34;唯一的&#34;属性,那么id
应该基于那个(Employee.hashCode
也应该与equals
一致),并且如另一个答案所述,hashCode
应该接受任何Employee.equals
作为参数。
答案 2 :(得分:0)
我没有测试,但尝试用
HashMap<Integer, Employee> empmap=new HashMap<>();
甚至
HashMap<Integer, Employee> empmap=new HashMap<Integer, Employee>();
答案 3 :(得分:0)
使用流可以在Java 8中很好地完成。
empmap.values().stream().anyMatch(emp.getName().equals(searchedName));
这将获取地图中所有条目的集合,并查看该流是否与名称等于searchedName
的任何条目匹配。
在类比中,您还可以使用Stream.filter()
实现不同版本的equals / hashcode很棘手,因为它以多种方式改变了类的行为。
答案 4 :(得分:0)
解决您问题的最简单方法是将此方法添加到Employee类中。 默默地,HashMap使用值对象(在本例中为Employee)的equals(Object o)来检查该对象的存在。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
if (name != null ? !name.equals(employee.name) : employee.name != null) return false;
return true;
}
注意,equals(Object o)的实现只适用于名称,不会检查其他字段。
Employee emp=new Employee();
emp.setId(10);
emp.setName("Maclean");
emp.setAge(240);
System.out.println(empmap.containsValue(emp));
System.out.println(emp1.equals(emp));
是
真 真