这个 hashCode 方法是如何工作的?

How this hashCode method works?

所以我没有完全理解hashCode Overridng的工作原理,所以我搜索了一个关于hashCode Overriding的教程。我找到了一个教程,在那里我学习了 hashCode 的概念,相同的对象必须具有相同的 hashCode(但这并不意味着不同的对象必须具有不同的 hashCode)。我没看懂的是他对hashcode的实现:

@Override
public int hashCode() {
    int hash = 7;
    hash = 31 * hash + Objects.hashCode(this.myShirtColor);
    return hash;
}

这里我不明白的是Objects.hashCode(this.myShirtColor)会给出什么? myShirtColor 是一个字符串。

好的,首先您需要了解两件事 String 不变性String Pool.

字符串不变性

it means that the content of the String Object can't be changed, once it is created.

字符串池

The Java string constant pool is an area in heap memory where Java stores literal string values. The heap is an area of memory used for run-time operations. When a new variable is created and given a value, Java checks to see if that exact value exists in the pool.

让我们在一个示例中总结两者,假设 String strOne="abc"; abc 值创建一次(字符串不可变性)并存储在字符串池中在堆中(String Pool),好的,如果我在同一个 JVM 上执行另一个字符串 String strTwo= "abc"; 怎么办编译器将检查池是否存在 abc为真则检索。

这意味着:strOne == strTwotrue 因为两者指的是同一个对象

好的,回到哈希码你现在可以看到你的案例中的 2 个对象是否具有相同的 shirtColor 将具有相同的哈希码

如果shirtColor="blue"例如 然后在你有一个对象之后,例如 class 的 shirt1 - 你没有提到 - 但假设 Shirt class 一个 blue 值字符串存储在堆中如果您创建了另一个 class Shirt 颜色 "blue" 的对象,例如 shirt2blue 值将从字符串池中获取与 shirt1shirtColor 如果您随后为两个对象调用 hashCode 它将是相同的,因为它取决于非常精确的对象 "blue".

Objects.hashCode 是一个简单的函数,它检查对象是否为空 returns 0 否则 returns 对象的 hashCode

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