-1

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

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

3 に答える 3

0

コメントアウトするかしないかに関係なく、同じオブジェクト(アドレス単位)をセットに2回追加することはできません。equals()(との正しい定義の場合hashCode())。

2つのオブジェクトがo1あり、o2それが同じことを「意味する」(同じデータを持つ)場合:

コメントアウトすると、2つのオブジェクトが同じである(または同じキーとして)と言っていても、hashCode()(ほとんどの場合)同じに両方を追加できます。これは、すべてのハッシュベースのデータ構造が、最初にハッシュコードで、次に。でオブジェクトを比較するためです。HashSetequals()HashMapequals()

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

于 2012-04-15T18:58:07.057 に答える
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.
于 2012-04-15T18:35:47.043 に答える
0

を省略すると、両方のオブジェクトが同じインスタンスである場合にのみ、メソッドequalsが使用されます。Object.equalstrue

したがって、異なるオブジェクト インスタンスを介して同じデータを追加すると、重複するオブジェクトは追加されませんが、重複するレコードが追加される可能性があります。

于 2012-04-15T18:38:43.717 に答える