Java 对象相等但仍添加到哈希集?
我正在向hashSet添加对象,iam覆盖hashcode()和equals()。我故意在这些函数中传递不同的实例变量 hashcode是diff,但对象仍然相等,它正在hashset中插入这两者 代码:Java 对象相等但仍添加到哈希集?,java,equals,hashset,Java,Equals,Hashset,我正在向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.
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());
}
Java总是按值传递
HashSet hs=newhashset();
employee1=新员工();
employee2=新员工();
雇员1.塞特城(“德里”);
雇员2.塞特城(“德里”);
雇员1.设定名称(“amol”);
雇员2.设定名称(“amol”);
hs.add(雇员1);
hs.add(雇员2);
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());
hs=newhashset();
employee1=新员工();
雇员1.塞特城(“德里”);
雇员1.设定名称(“amol”);
雇员2=雇员1;
hs.add(雇员1);
hs.add(雇员2);
System.out.println(hs.size());
输出将为1。这意味着其中一项不是唯一的
阅读我发布的链接以获得更清晰的信息,如果您有任何疑问,请在评论中提问。如果名为“Andrucz”的员工应与名为“Andrucz”的员工相等,两个实例应具有相同的哈希代码,因此您必须使用toLowerCase()
或toupercase()
生成它
还记得根据Java约定命名一个类。类应命名为employee,而不是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;
}
它们可能有相同的
名称
(因此是“相等的”),但它们有不同的hashCode
s!因此,它们会转到不同的存储桶,并且不检查相等性。相等性不是在hashSet中添加对象的优先级吗。。。我是用英文读的headfirst@BenjaminLowry他想知道为什么对象被添加,即使它们有相同的值。@jitinkindian是的,我现在看到他的问题了,我的问题是,如果它们相等,它们必须有相同的哈希代码。
@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;
}