2015-10-24 88 views
-2
import java.util.Enumeration; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Vector; 

public class Test { 

    public static void main(String[] args) { 

     Employee e1 = new Employee("abc",10.0); 
     Employee e3 = new Employee("abc",10.0); 

     HashSet<Employee> hs = new HashSet<Employee>(); 
     hs.add(e1); 
     hs.add(e3); 

     System.out.println("size of hs : "+hs.size()); 

     Object [] aa = hs.toArray(); 

     for(int i=0;i<aa.length;i++){ 

      Object ii = aa[i]; 
      System.out.println("ii "+(i+1)+"="+ii.toString()); 
     } 

     Iterator it = hs.iterator(); 

     while(it.hasNext()){ 
      Employee e4 = (Employee) it.next(); 
      System.out.println("e4 ="+e4); 
      System.out.println("111="+it.next()); 
     } 

     Enumeration e5 = new Vector(hs).elements(); 
     while(e5.hasMoreElements()){ 
      Employee e6 = (Employee) e5.nextElement(); 
      System.out.println("e6 ="+e6); 
     } 

    } 

} 

public class Employee { 

    private String name; 
    private Double salary; 

    public Employee(String name, Double salary){ 
     this.name = name; 
     this.salary = salary; 
    } 

    public Employee(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Double getSalary() { 
     return salary; 
    } 

    public void setSalary(Double salary) { 
     this.salary = salary; 
    } 

    @Override 
    public String toString() { 
     return "Employee [name=" + name + ", salary=" + salary + "]"; 
    } 

    public void getNameSal() throws NullPointerException{ 
     System.out.println(this.name +""+this.salary); 
    } 

} 

看着上面的代碼,我創建了一個接受Employee類對象的散列集。 我創建了Employee類的兩個對象,它們具有相同的值並添加到散列集中。 但是,當我打印大小的哈希集顯示2. 而且當通過將其轉換爲數組,IteratorEnumerator三種方式進行迭代時,它會顯示兩個重複的值。 但是,當我嘗試使用it.next()打印時,它只打印單個值。 這是爲什麼?爲什麼哈希集允許添加重複對象?

Output: 
size of hs : 2 
ii 1=Employee [name=abc, salary=10.0] 
ii 2=Employee [name=abc, salary=10.0] 
e4 =Employee [name=abc, salary=10.0] 
111=Employee [name=abc, salary=10.0] 
e6 =Employee [name=abc, salary=10.0] 
e6 =Employee [name=abc, salary=10.0] 
+7

問自己一個問題:如何知道兩個員工是否平等?閱讀Set的javadoc。 (和HashSet) –

+1

您不會覆蓋僱員類中的equals和hashcode,並且您在調用iterator.next()兩次時,一次是在初始化變量時,一次是在打印時。 –

回答

2

如果不實現equals()和hashCode()爲你的Employee類,HashSet的使用默認等於實現,即一個對象只等於本身。因此,您的兩個Employee對象不相等,因此第二個對象不會覆蓋第一個對象。 因此,解決方案是在您的Employee類上實現equals()和hashCode(),並檢查所有字段是否相等,這是您定義的兩個Employees相等的一部分。

您只會看到一名員工打印,因爲您的代碼中存在一個錯誤:您在第一個while循環的每次迭代中都會調用next()兩次。

+0

如果不談論hashCode(),那麼這個答案並不完整。 –

+0

你說得對,我回答得太快:) –

1

HashSet正在使用hashCodeequals方法的引擎蓋後面的對象。

由於您沒有爲Employee類覆蓋這些方法,因此HashSet只能看到兩個員工在共享相同實例的情況下相同。

要解決您的問題,您需要在Employee類中覆蓋hashCodeequals方法。

+1

** HashSet **使用hashCode和equals()。並非所有的Set實現都可以。 Set不使用任何東西:它是一個接口。 –

+0

你說得對,我編輯了我的修改。謝謝 – Maxime