hashCode()方法使用class来计算哈希码?

时间:2016-06-06 17:31:36

标签: hashcode

在采访中,采访者问我 - 基于Class计算的哈希码是什么?

我告诉他,哈希码将根据类中的字段或变量计算。他给了我一些表达,让我觉得答案是错误的。

我阅读了java doc,但我没有明确的想法。我读了帖子how is hascode calculated in java因为有整数哈希码和字符哈希码。谁能告诉我如何计算特定对象的哈希码以及什么是Interger哈希码和字符串哈希码?

2 个答案:

答案 0 :(得分:0)

你不清楚你的意思是“hashCode()方法使用class来计算哈希码?”。如果你看一下Object.hashCode()方法的签名,你就会意识到

  1. 这是任何Java类都可以覆盖的实例方法。
  2. 如果一个类(默认情况下,扩展java.lang.Object类)会覆盖此方法,那么它可以负责为该类的实例创建有意义的哈希代码。除其他外,这有助于将此类的实例作为哈希表中的键(使用java.util.Hashtablejava.util.HashMap实现)。
  3. 如果你看一下这个方法的一些标准库(JDK)类实现,你会发现这些类有意义地实现了这个方法。

    hashCode()类的java.lang.Integer实现正确地选择返回该类的实例所代表的整数值。

    hashCode()类的java.lang.String实现更复杂,您可以在源代码中找到它:

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    

    由于性能(和正确性)的原因,这里有很多内容,但你可以知道字符串的哈希码是基于字符串的字符组成的。

答案 1 :(得分:0)

如果考虑使用hashCode()类的Object方法,则该方法是通过将对象的地址转换为整数来计算的。

参考: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()