2012-04-15 68 views
-1

我有一個POJO,其中包含hashcode()equals()方法,我已覆蓋,但我的查詢是,如果我如果我做hashcode()方法評論然後在集合讓我說當我在一個哈希映射存儲用戶定義的對象,那麼它會產生什麼樣的影響......另一件事是,如果我將equals方法作爲註釋,那麼它會產生什麼影響如果我嘗試輸入重複記錄,它會將重複記錄存儲兩次!關於hashcode()和等於()

public class Employee { 

String name,job; 
int salary; 

public Employee(String n , String j, int t) 
{ 
    this.name= n; 
    this.job=j; 
    this.salary= t;   
} 

/* @Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((job == null) ? 0 : job.hashCode()); 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    result = prime * result + salary; 
    return result; 
}*/ 

/*@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Employee other = (Employee) obj; 
    if (job == null) { 
     if (other.job != null) 
      return false; 
    } else if (!job.equals(other.job)) 
     return false; 
    if (name == null) { 
     if (other.name != null) 
      return false; 
    } else if (!name.equals(other.name)) 
     return false; 
    if (salary != other.salary) 
     return false; 
    return true; 
} 
*/ 

@Override 
public int hashCode() 
    {  
    return name.hashCode()+job.hashCode()+salary;  

} 

@Override 
    public boolean equals(Object obj) { 
    if (this == obj) 
    { 
     return true; 
    } 
    // make sure o can be cast to this class 
    if (obj == null || obj.getClass() != getClass()) 
    { 
     // cannot cast 
     return false; 
    }   

    Employee e = (Employee) obj; 
    return this.name.equals(e.name)&&this.job.equals(e.job)&&this.salary==e.salary; 
} 

@Override 
public String toString() { 
     return name+"\t" +"\t"+ job +"\t"+ salary; 
    } 
} 
+1

您在討論'equals()'和'hasCode()'方法時**的影響**。您是否沒有注意到當您將它們交替註釋掉(或可能同時存在)時會發生什麼? – Lion 2012-04-15 18:43:46

回答

0

一旦你評論了一些東西,它不會被編譯,也不會對你的程序的其他部分產生任何影響。

此外,並非重寫Object.equals()方法意味着equals()只會在兩個對象是相同的實例時才返回true。例如:

int[] data = data; //data to create object 
mObject o1 = new mObject(data); //new object from data 
mObject o2 = new mObject(data); //another object from the same data 
System.out.println(o1.equals(o2)); //prints false even though o1 and o2 contain the same information. 
0

如果你離開了equals,它將使用Object.equals方法,這是true只有兩個對象是相同的實例。

。由此,重複對象不會添加,但重複記錄可以添加,如果通過不同的對象實例添加相同的數據。

0

不管你做什麼或不做評論,相同的對象(地址明智)不能被添加兩次到一個集合。 (對於equals()hashCode()的任何理智的定義)。

當你有兩個對象o1o2說,「意思是」同樣的事情(有相同的數據):

如果您註釋掉hashCode(),你(幾乎總是)就可以既增加相同HashSet,即使equals()表示這兩個對象是相同的(或作爲相同HashMap的鍵)。這是因爲所有基於散列的數據結構首先通過散列碼比較對象,然後通過equals()進行比較。

如果你評論equals()沒有評論hashCode(),所有集合的行爲就好像對象不相等。這是因爲即使基於散列的比較在檢查hashCode()之後檢查equals(),因爲即使在適當的實現hashCode()equals()中也可能發生散列衝突。

+0

第一句話極具誤導性。引用集合的「相同對象」完全由'hashCode()'和'equals()'定義。雖然這是可笑的,但可以將這些定義爲「同一對象」返回不同的值。 – 2012-04-15 19:17:52

+0

編輯清除。 – trutheality 2012-04-15 19:42:31