2016-02-12 36 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; 
} 
相關問題