【问题标题】:Overridden hashCode() function is not called by any of HashMap methods任何 HashMap 方法都不会调用覆盖的 hashCode() 函数
【发布时间】:2014-10-15 19:46:33
【问题描述】:

我在下面给出的类Supplier 中覆盖了hashCode() 和equals() 方法。

public class Supplier {

private final String name;

public Supplier(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

@Override
public int hashCode() {        
    char[] charArray = name.toCharArray();
    int sumOfchars = 0;
    for (char element : charArray) {
        sumOfchars += element;
    }
    return 51 * sumOfchars;
}

@Override
public boolean equals(Object o) {        
    if (o == null) {
        return false;
    }
    if (getClass() != o.getClass()) {
        return false;
    }
    final Supplier other = (Supplier) o;
    return this.name.equals(other.name);
}
}

这个类的对象被添加到一个以name字段为Key的HashMap中。

Supplier s1 = new Supplier("supplierA");
Supplier s2 = new Supplier("supplierB");
Map<String, Supplier> supplierMap = new HashMap<>();
supplierMap.put(s1.getName(), s1);
supplierMap.put(s2.getName(), s2);
supplierMap.containsKey("supplierA"));

但是,当我 put()get() 一个元素时,我覆盖的 hashCode() 方法不会被调用。当我使用contains(Key key) 时,equals() 的情况也是如此。我认为HashMap 内部调用hashCode() 以防putget()。在contains() 的情况下调用equals。请对此有所了解。

【问题讨论】:

    标签: java hashmap equals hashcode


    【解决方案1】:

    当您在HashMapput 时,会在键上调用hashCode() 方法,而不是值。所以在这种情况下,来自StringhashCodes1.getName()s2.getName() 调用。

    【讨论】:

    • 如果 Key 的类型为 String ,则您的意思是调用 java.lang.String 类中的 hashCode()equals() 方法呢,它也是从String 类调用的。但如果是这样,我该如何根据我的 Object 类型强加 equals() 方法。有点混乱。
    • 在这种情况下,您使用供应商的名称作为键。如果你使用了不是String 的东西,你会得到一些其他的hashCode 方法被调用。
    【解决方案2】:

    您使用 'name' 的 java.lang.String 值作为键 - 因此不会调用对象上的 hashcode 方法。

    如果您要执行 Map 或其他操作,则会调用它。

    【讨论】:

    • 谢谢,将我的代码更改为Map&lt;Supplier, String&gt; supplierMap = new HashMap&lt;&gt;(10); 它确实调用了我覆盖的hashCode() 方法。但在contains() 的情况下,hashCode() 被调用但equals() 未被调用。有什么线索吗?
    • 只有在同一个bucket中有多个对象时才会调用equals
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多