因此我不完全了解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是一个字符串。
答案 0 :(得分:-1)
首先,您需要了解两件事字符串不可变性和字符串池。
字符串不变
这意味着一次不能更改字符串对象的内容 它已创建。
字符串池
Java字符串常量池是堆内存中Java所在的区域 存储文字字符串值。堆是用于以下目的的内存区域 运行时操作。创建新变量并为其赋值时, Java检查池中是否存在该确切值。
让我们在一个示例中将两者加起来,假设url
String strOne="abc";
值创建一次( String Immutability )并存储在堆中的字符串池中( String Pool ),好吧,如果我在同一个JVM上执行另一个字符串abc
,那么编译器将检查该池String strTwo= "abc";
是否存在(如果存在),然后将其检索。 / p>
这意味着:abc
是strOne == 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)