在Java中覆写hashCode()方法

即使重写了equals()方法,也无法在HashSet中使用remove()函数。

スクリーンショット 2015-12-08 18.58.45.png

重写hashCode()方法

▪️Test54.java的内部文件

import java.util.*;

public class Test54 {
    public static void main(String[] args) {
        Set<Hero54> list = new HashSet<Hero54>();
        Hero54 h1 = new Hero54();
        h1.name = "ミナト";
        list.add(h1);
        System.out.println("要素数=" + list.size());
        h1 = new Hero54();
        h1.name = "ミナト";
        list.remove(h1);
        System.out.println("要素数=" + list.size());
    }

}

▪️英雄54.java

import java.util.*;

public class Hero54 {

    private int hp;
    public String name;

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (o == null)
            return false;
        if (!(o instanceof Hero54))
            return false;
        Hero54 r = (Hero54) 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 + hp;
        return result;
    }
}

▪️Test54.java 执行结果
元素数量=1
元素数量=0

在覆写hashCode()之前

英雄54.java

import java.util.*;

public class Hero54 {

    private int hp;
    public String name;

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

Test54.java 执行结果
元素数量=1
元素数量=1

HashSet 是一个具有以下特点的数据结构:
– 不允许重复元素
– 基本上没有顺序关系


hashCode()的重写示例②

▪️Test55.java覆盖了hashCode()的例子2。

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 = "ねこ2";
        Cat55 c3 = new Cat55();
        c3.name = "ねこ3";
        cat.add(c1);
        cat.add(c2);
        cat.add(c3);
        System.out.println(c1);
        System.out.println(cat.size());
        cat.remove(c2);
        System.out.println(cat.size());

    }

}

▪️Cat55.java的hashCode()方法重写示例二

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 f = (Cat55) o;
        if (!this.name.trim().equals(f.name.trim())) {
            return false;
        }
        return true;
    }

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

}

其实就是只要hashCode相同,equals返回true的对象就被视为相同的。如果hashCode不相同,equals根本不会被评估。

▪️Test55.java hashCode()方法覆盖示例2 执行结果
Cat55@bbd407
3
2

以下是一種可能的漢語翻譯:
▪️ 補充
Cat55.java 的含義是

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

    public boolean equals(Object o) {
        if (this.name == o) {
            return true;
        }
        return false;
    }

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

}

无论如何,结果都是一样的

bannerAds