Java - 覆盖 hashCode 和 toString

Java - Overriding hashCode and toString

当两个对象在 class A 中具有相同的 ele 值时,这两个对象是相等的。所以我已经将 toString 和 hashCode 覆盖为 return 对象的 ele (不考虑任何地方 s 的值)。

public class A {
    private int ele;
    private String s;

    public int getEle() {
        return ele;
    }

    public void setEle(int ele) {
        this.ele = ele;
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    @Override
    public int hashCode(){
        return ele;
    }

    @Override
    public String toString() {
        return String.valueOf(ele);
    }
}

public static void main(String[] args) {

    Map<A, String> map = new HashMap<>();
    A a1 = new A();
    a1.setEle(10);
    a1.setS("abc");

    A a2 = new A();
    a2.setEle(10);
    a2.setS("efg");

    map.put(a1, "val1");
    map.put(a2, "val2");

    System.out.println(map.get(a1));
    System.out.println(map.get(a2));

}

输出:

val1
val2

但是如果我将 a1a2 的值放在地图中,我期望 val1val2 被 returned map.get(a1)map.get(a2)

当然,a1a2 具有相同的哈希码,但它们不被视为相等,因为您没有覆盖 equals 来考虑两个 A ele 相同的对象相等。地图在使用哈希码后将使用 equals 到最终平等的统治者。地图会将两个对象放在同一个桶中,但因为它们不相等,所以它会同时保留两个对象。

覆盖 equals 以便它 returns true 如果另一个对象是 A 并且它们具有相同的 ele。然后你会看到 val2 将返回给两个 get 调用。

每次使用 new 关键字时,它都会在 heap 内存中创建一个新的 object。所以,a1a2 实际上都是不同的对象。

有关 new 关键字 What New keyword do Internally in Java

的更多信息,请参阅此内容

您需要实施 equals() 以在添加到地图时考虑 ele 值,即:

public class A {

    private int ele;
    private String s;

    public int getEle() {
        return ele;
    }

    public void setEle(int ele) {
        this.ele = ele;
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        A a = (A) o;

        return ele == a.ele;

    }

    @Override
    public int hashCode() {
        return ele;
    }
}

这将使您return只需要一个值。