此hashCode方法如何工作?

时间:2019-07-15 23:29:12

标签: java oop hashcode

因此我不完全了解hashCode Overridng的工作原理,因此我搜索了有关hashCode Overriding的教程。我找到了一个学习了hashCode概念的教程,同一对象必须具有相同的hashCode(但这并不意味着不同的对象必须具有不同的hashCode)。我不明白的是他对哈希码的实现:

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

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

1 个答案:

答案 0 :(得分:-1)

首先,您需要了解两件事字符串不可变性字符串池

字符串不变

  

这意味着一次不能更改字符串对象的内容   它已创建。

字符串池

  

Java字符串常量池是堆内存中Java所在的区域   存储文字字符串值。堆是用于以下目的的内存区域   运行时操作。创建新变量并为其赋值时,   Java检查池中是否存在该确切值。

让我们在一个示例中将两者加起来,假设url String strOne="abc";值创建一次( String Immutability )并存储在堆中的字符串池中( String Pool ),好吧,如果我在同一个JVM上执行另一个字符串abc,那么编译器将检查该池String strTwo= "abc";是否存在(如果存在),然后将其检索。 / p>

这意味着:abcstrOne == strTwo,因为它们都引用相同的对象

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

例如shirtColor 然后,在您拥有类的对象shirtColor="blue"之后-您没有提及-但是假设shirt1类,如果您创建了另一个{类,则将Shirt值字符串存储在堆中颜色为blue的{​​1}},例如Shirt,如果满足以下条件,将从字符串池中提取与"blue"的{​​{1}}完全相同的对象shirt2:然后您将两个对象的blue称为shirt1,因为它取决于非常精确的对象shirtColor

hashCode是一个简单的函数,它会检查null是否返回0,否则检查对象,否则返回对象的hashCode

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