Java - 重写 hashCode 和 toString

标签 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 的值放在一个映射中,我期望的是 val1val2map.get(a1)map.get(a2) 返回。

最佳答案

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

覆盖 equals以便它返回 true如果另一个对象是 A他们都有相同的ele .然后你会看到 val2 get 都将返回电话。

关于Java - 重写 hashCode 和 toString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290579/

相关文章:

java - 如何更新 JLabel 中的 ImageIcon?

java - 当我从 Groovy 语言转换为 Java 语言时,如何在 iReport 中添加我自己的类?

Java 8 : Change the values of an EntrySet stream

java - 两个键是相同的 hashMap 覆盖写“现有的?

java - 为什么我无法访问匿名内部类中重写的公共(public)字段?

java - 获取列表的最小和最大字符串

python - 我可以展平一个深度嵌套的 Python 字典,它包含带有更多嵌套字典列表的值吗?

python - 使用键作为方法(getter 和 setter)调用语法访问字典

java - Java 中的散列键

data-structures - Redis : Pros and Cons for following two approaches