2016-02-12 50 views
1

我正在将对象添加到hashSet,iam覆盖hashcode()和equals()。我有意在这些对象相等但仍添加到hashSet?

哈希码传递不同的实例变量是差异但对象相等仍然是既在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()); 
} 
+3

它们可能具有相同的'name'(因此是“相等”),但它们有不同的'hashCode's!所以他们去不同的桶,平等不检查。 –

+0

不等于在hashSet中添加对象的优先级...我在headfirst中读取 – Amol

+0

@BenjaminLowry他想知道为什么即使它们具有相同的值,对象也会被添加。 –

回答

-1

爪哇总是传递价值。 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。因此,这意味着该项目的一个不是唯一的。

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

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