LoginSignup
0
0

More than 5 years have passed since last update.

hashCode() オーバーライド 例

Posted at

▪️Test55.java

import java.util.*;

public class Test55 {
    public static void main(String[] args) {
        Set<Cat55> cat = new HashSet<Cat55>();
        Cat55 c1 = new Cat55();
        c1.name = "ねこ";
        Cat55 c2 = new Cat55();
        c2.name = "ねこa";
        Cat55 c3 = new Cat55();
        c3.name = "ねこb";
        Cat55 c4 = new Cat55();
        c4.name = "ねこc";
        Cat55 c5 = new Cat55();
        c5.name = "ねこk";
        Cat55 c6 = new Cat55();
        c6.name = "ねこl";

        cat.add(c1);
        cat.add(c2);
        cat.add(c3);
        cat.add(c4);
        cat.add(c5);
        cat.add(c6);
        System.out.println("要素数=" + cat.size());

        // これをやることでc2オブジェクトのメンバー変数が全部空っぽになる
        c2 = new Cat55();
        c2.name = "ねこa";
        // c2 = new Cat55();これをやることでc2オブジェクトの
        // メンバー変数が全部空っぽになります
        // 前にnewしたc2はリストの中に追加されてる
        // 後にnewしたc2はリストの中に入ってない
        // size()は格納されてる要素数を返す
        // remove()を呼び出すとequalsメソッドが呼び出される
        // equalsメソッドでは、リスト内に格納されている変数のnameが同じなら
        // trueが変えるので、
        // c2はそもそもリストに格納されていない
        // c2.name = "ねこa"をc2.name = "ねこf";にすると
        // removeされないので結果は3のままになってしまう
        // c2.name = "ねこa"なら、removeでequalsメソッドを呼び出した時
        // equalsメソッドでリスト内に格納されたnameと等しければtrueで
        // removeできる
        // つまりリスト内に格納されているnameと等しければremoveできる
        // c2.name = "ねこa";をc2.name = "ねこ";にしてもremoveできる
        // 後にnewしたc2と同じ名前のc2.name = "ねこa";がリストに格納されている
        // nameと同じならtrueでremoveできる

        cat.remove(c2);
        System.out.println(cat.size());

        cat.remove(c4);
        System.out.println(cat.size());

        c4 = new Cat55();
        c4.name = "ねこj";
        // removeできない
        cat.remove(c4);
        System.out.println(cat.size());

        cat.add(c4);
        System.out.println(cat.size());

        cat.remove(c4);
        System.out.println("c4をremove=" + cat.size());
        System.out.println("c4をremove成功");
        System.out.println("");

        // 最初removeできてなかったのはc4がリストに格納されてなかったから
        // cat.add(c4);でc4をリストに格納した
        // removeでequalsメソッドが呼び出される
        // equalsメソッドでリストに格納されているnameと同じであれば
        // trueを返すので、removeされる
        System.out.println("元々=" + cat.size());
        c5 = new Cat55();
        c5.name = "ねこk";
        cat.remove(c5);
        System.out.println("格納されているリスト数=" + cat.size());

        // cat.add(c5);
        System.out.println(cat.size());
        cat.remove(c5);
        System.out.println(cat.size());

        c6 = new Cat55();
        c6.name = "ねこm";
        cat.remove(c6);
        System.out.println("c6remove後=" + cat.size());

        c6.name = "ねこn";
        cat.add(c6);
        System.out.println(cat.size());
        System.out.println(cat);

    }

}

▪️Cat55.java


public class Cat55 {
    private int cp;
    public String name;

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (o == null)
            return false;
        if (!(o instanceof Cat55))
            return false;
        Cat55 r = (Cat55) o;
        if (!this.name.trim().equals(r.name.trim())) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        int result = 37;
        result = result * 31 + name.hashCode();
        result = result * 31 + cp;
        return result;
    }

}

▪️Test55,java 実行結果
要素数=6
5
4
4
5
c4をremove=4
c4をremove成功

元々=4
格納されているリスト数=3
3
3
c6remove後=3
4
[Cat55@16b95ac9, Cat55@bc2e1f, Cat55@16b95c3d, Cat55@16b95bff]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0