我正在向hashSet添加对象,iam重写hashcode()和equals()。我故意在这些
中传递不同的实例变量hashcode是diff,但是对象是相同的,它仍然在hashset中插入
代码:
HashSet hs = new HashSet();
employee e1 = new employee();
employee e2 = new employee();
e1.setname("amol1"); e1.setcity("bombay");
e2.setname("amol1"); e2.setcity("delhi");
System.out.println("e1 --> "+e1.hashCode()+ " and e2 --> " +e2.hashCode() + " " + e1.equals(e2));
hs.add(e1); hs.add(e2)
覆盖方法:
@Override
public int hashCode()
{
return city.hashCode();
}
@Override
public boolean equals(Object o)
{
employee e = (employee)o;
return getname().equalsIgnoreCase(e.getname());
}
答案 0 :(得分:0)
如果员工姓名" Andrucz"应该等于名为" andrucz"的员工,两个实例应该具有相同的hashCode,因此您必须使用toLowerCase()
或toUpperCase()
生成它。
还要记住命名一个尊重Java约定的类。应该将类命名为Employee。而不是员工。
还要记住检查equals方法参数是否是Employee类的实例。
@Override
public int hashCode() {
return getName().toUpperCase().hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof Employee) {
Employee e = (Employee) o;
return getName().equalsIgnoreCase(e.getName());
}
return false;
}
答案 1 :(得分:-1)
Java总是按值传递。 Java is pass by value (read the 3rd answer in this link)
HashSet<Employee> hs = new HashSet<Employee>();
Employee employee1 = new Employee();
Employee employee2 = new Employee();
employee1.setCity("delhi");
employee2.setCity("delhi");
employee1.setName("amol");
employee2.setName("amol");
hs.add(employee1);
hs.add(employee2);
System.out.println(hs.size());
输出为2。
hs = new HashSet<Employee>();
employee1 = new Employee();
employee1.setCity("delhi");
employee1.setName("amol");
employee2 = employee1;
hs.add(employee1);
hs.add(employee2);
System.out.println(hs.size());
输出将为1.这意味着其中一个项目不是唯一的。
阅读我发布的链接以获得更清晰的信息,如果您有任何疑问,请在评论中提问。