对象是相同的,但仍然添加到hashSet?

时间:2016-02-12 03:34:49

标签: 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.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());
 }

2 个答案:

答案 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.这意味着其中一个项目不是唯一的。

阅读我发布的链接以获得更清晰的信息,如果您有任何疑问,请在评论中提问。