Setを使用してObjectオブジェクトを格納し、equalsメソッドとhashCodeメソッドを書き換える

1876 ワード

コンセプト


SetインタフェースはCollectionインタフェースを継承し、無秩序で重複しないオブジェクトのセットを含むために使用されます.その一般的な実装クラスはHashSet(内部オブジェクトはハッシュ・アクセスであり、ハッシュ・テクノロジーを採用しています)、TreeSet(格納されたデータは昇順です)です.
次はHashSetでSetストレージをテストします
Studnet.java
public class Student {
private String id;
private String name;

public Student(String id, String name) {
    super();
    this.id = id;
    this.name = name;
}

public String getId() {
    return id;
}

public String getName() {
    return name;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        System.out.println("true");
        return true;
    }
    if ((obj == null) || (obj.getClass() != this.getClass())) {
        System.out.println("false");
        return false;
    }
    if (id == ((Student) obj).id && name == ((Student) obj).name) {
        return true;
    } else {
        return false;
    }
    }

@Override
public int hashCode() {
    int flag = 36;
    int idNum = Integer.parseInt(id);
    return flag * idNum;
}
}

HashSetTest.java
import java.util.HashSet;
import java.util.Set;

public class HashSetTest {

public static void main(String[] args) {
    Student s1=new Student("1","li");
    Student s2=new Student("2","ji");
    Student s3=new Student("3","ji");
    Student s4=new Student("3","ji");
    Set hs=new HashSet<>();
    hs.add(s1);
    hs.add(s2);
    hs.add(s3);
    hs.add(s4);
    for (Student student : hs) {
        System.out.println(student.getId()+":"+student.getName());
    }
}

}

実行結果:1:li 2:ji 3:ji
ぶんせき
Setを使用してObjectのオブジェクトを格納するにはaddメソッドを実行するときにequalsメソッドが既存の値と等しいかどうかを判断してから、同じhash値があるかどうかを判断します.この2つのメソッドの結果がtrueであれば、このオブジェクトは既に存在していると考え、挿入しないので、equalsとhashCodeメソッドを書き換えます.