Java - 覆盖hashCode和toString

时间:2016-03-29 17:01:04

标签: java dictionary hashmap equals tostring

当两个对象在A类中具有相同的ele值时,那两个对象是相等的。所以我重写了toString和hashCode来返回对象的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都可以返回map.get(a1)map.get(a2) agc-before-draw

3 个答案:

答案 0 :(得分:7)

当然,a1a2具有相同的哈希码,但它们并不被认为是相同的,因为您没有覆盖equals来考虑两个{{1}具有相同A的对象是相等的。在使用哈希码后,映射将使用ele与最终标尺相等。地图会将两个对象放在同一个存储桶中,但由于它们不相等,所以它们都会保留两者。

覆盖equals,以便在另一个对象为equals时返回true并且它们都具有相同的A。然后,您会看到两个ele来电都会返回val2

答案 1 :(得分:1)

在添加到地图时,您需要实现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;
    }
}

这将使您只返回一个值。

答案 2 :(得分:0)

每次使用new关键字时,都会在object内存中生成新的heap。因此,a1a2实际上都是不同的对象。

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

的详情,请参阅此处