这个 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 == strTwo
是 true
因为两者指的是同一个对象
好的,回到哈希码你现在可以看到你的案例中的 2 个对象是否具有相同的
shirtColor
将具有相同的哈希码
如果shirtColor="blue"
例如
然后在你有一个对象之后,例如 class 的 shirt1
- 你没有提到 - 但假设 Shirt
class 一个 blue
值字符串存储在堆中如果您创建了另一个 class Shirt
颜色 "blue"
的对象,例如 shirt2
,blue
值将从字符串池中获取与 shirt1
的 shirtColor
如果您随后为两个对象调用 hashCode
它将是相同的,因为它取决于非常精确的对象 "blue"
.
Objects.hashCode
是一个简单的函数,它检查对象是否为空 returns 0 否则 returns 对象的 hashCode
https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#hashCode(java.lang.Object)
所以我没有完全理解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 == strTwo
是 true
因为两者指的是同一个对象
好的,回到哈希码你现在可以看到你的案例中的 2 个对象是否具有相同的
shirtColor
将具有相同的哈希码
如果shirtColor="blue"
例如
然后在你有一个对象之后,例如 class 的 shirt1
- 你没有提到 - 但假设 Shirt
class 一个 blue
值字符串存储在堆中如果您创建了另一个 class Shirt
颜色 "blue"
的对象,例如 shirt2
,blue
值将从字符串池中获取与 shirt1
的 shirtColor
如果您随后为两个对象调用 hashCode
它将是相同的,因为它取决于非常精确的对象 "blue"
.
Objects.hashCode
是一个简单的函数,它检查对象是否为空 returns 0 否则 returns 对象的 hashCode
https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#hashCode(java.lang.Object)