gpt4 book ai didi

java - 虽然哈希值不同,但为什么我的对象存储在同一位置?

转载 作者:行者123 更新时间:2023-12-02 08:33:59 26 4
gpt4 key购买 nike

我有一个 Movie 类,我仅重写 hashCode() 方法。请在下面找到java类

public class Movie {

private String actor;
private String name;
private String releaseYr;

public String getActor() {
return actor;
}

public void setActor(String actor) {
this.actor = actor;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getReleaseYr() {
return releaseYr;
}

public void setReleaseYr(String releaseYr) {
this.releaseYr = releaseYr;
}
@Override
public int hashCode() {
return actor.hashCode() + name.hashCode() + releaseYr.hashCode();
}


}

我创建了两个 Movie 对象,这两个对象的所有属性值都相同,并将它们放入 HashMap 中。下面是代码

import java.util.HashMap;

public class Test {

public static void main(String[] args) {

Movie m1 = new Movie();
m1.setActor("Akshay");
m1.setName("Taskvir");
m1.setReleaseYr("2010");

Movie m2 = new Movie();
m2.setActor("Akshay");
m2.setName("Taskvir");
m2.setReleaseYr("2010");


HashMap<Movie, String> map = new HashMap<Movie, String>();

map.put(m1, "Value of m1");
map.put(m2, "Value of m2");

}

}

我得到了预期的结果。由于我仅重写 hashCode() 方法,并且两个对象的哈希值相同,因此它们存储在 HashMap 表数组的相同索引位置中。以下是 Debug模式下的预期结果。

enter image description here

但是,如果我不重写 hashCode() 方法,而是重写 equals() 方法,它们将存储在 HashMap 表数组的相同索引位置中。 虽然我可以看到哈希值不同。下面是我的 equals 方法

@Override
public boolean equals(Object obj) {

Movie m1 = (Movie) obj;
boolean result = false;

if (m1.getActor().equals(this.actor) && m1.getName().equals(this.name)
&& m1.getReleaseYr().equals(this.releaseYr)) {
result = true;
}

return result;
}

Debug模式下的输出

enter image description here

如果我不重写 equals 和 hashCode 方法,那么我也会得到相同的意外结果。

根据我的理解,如果我不重写 equalshashCode 方法或仅重写 equals 方法,则 m1m2 对象应存储在不同的位置,因为 m1m2 对象的哈希值不同。但在这种情况下,它没有发生。

有人可以解释一下为什么使用不同的哈希值,我的对象存储在同一位置吗?

我使用过 Java 8。

最佳答案

哈希码的范围巨大,从 Integer.MIN_VALUEInteger.MAX_VALUE,而 HashMap通常具有更少的存储桶(默认情况下,新实例化的 HashMap 为 16 个,至少在 OpenJDK 11 中是这样)。因此,哈希码完全有可能发生冲突,并且多个对象将被添加到同一个存储桶中,甚至是预料之中的。但是,请注意,如果您没有重写 hashCode(),则此行为完全是偶然的,并且不能依赖。

关于java - 虽然哈希值不同,但为什么我的对象存储在同一位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53905753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com