2012-04-15 9 views
-1

私はhashcode()equals()メソッドを含んでいますが、オーバーライドしたメソッドがありますが、私のクエリはそれです。もし私がhashcode()メソッドコメントを作成していれば、私はハッシュマップで言うことができます。ユーザー定義のオブジェクトを格納すると、どのような影響がありますか...もう1つは、コメントとしてequalsメソッドを作成すると、どのような影響がありますか?重複レコードを入力しようとすると、重複レコードが2回格納されます。hashcode()とequals()について

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

答えて

0

何かをコメントアウトすると、それはコンパイルされず、残りのプログラムには影響しません。

また、Object.equals()メソッドをオーバーライドしないと、equals()は、2つのオブジェクトが同じインスタンスである場合にのみ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を省略した場合、それは両方のオブジェクトが同じインスタンスである場合にのみtrueあるObject.equalsメソッドを使用します。

はこのように、オブジェクトが追加されることはありませんが重複していますが、別のオブジェクトインスタンスを通じて同じデータを追加した場合、を添加してもよいレコードを複製します。

0

同じオブジェクト(アドレス指定)をセットに2回追加することはできません。 (equals()hashCode()の任意の正常な定義の場合)。あなたがhashCode()をコメントアウトした場合

、あなた(ほとんど常に)が同じに両方を追加することができるようになります。同じことを(同じデータを持っている)「平均」という

次の2つのオブジェクトo1o2を持っていますHashSetであっても、equals()は、2つのオブジェクトが同じである(または、同じオブジェクトのキーと同じ)ことを示しています。これは、すべてのハッシュベースのデータ構造が最初にハッシュコードでオブジェクトを次にequals()で比較するためです。

equals()にコメントを付けずにhashCode()とコメントアウトすると、すべてのコレクションはオブジェクトが等しくないように動作します。これは、ハッシュ衝突がhashCode()equals()の適切な実装であっても発生する可能性があるため、ハッシュベースの比較でもhashCode()をチェックした後にequals()をチェックするためです。

+0

最初の文は非常に誤解を招く。コレクションを参照する "同じオブジェクト"は、 'hashCode()'と 'equals()'によって完全に定義されます。愚かではありますが、これらを定義して「同じオブジェクト」に対して異なる値を返すことは可能です。 –

+0

これを消去するように編集しました。 – trutheality

関連する問題