Java 对象相等但仍添加到哈希集?

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添加对象,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());
 }

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