作者:LYJ189_163 | 来源:互联网 | 2022-11-23 20:40
我有一个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 map = new HashMap();
map.put(m1, "Value of m1");
map.put(m2, "Value of m2");
}
}
我得到了预期的结果.正如我只重写hashcode()方法和两个对象的哈希值是相同的,所以它们被存储在相同的索引位置的HashMap表阵列的.以下是调试模式下的预期结果.
但是如果我不覆盖hashCode()方法但是覆盖equals()方法,它们将存储在HashMap表数组的相同索引位置.虽然我可以看到哈希值不同.以下是我的等于方法
@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;
}
调试模式下的输出
如果我不重写equals和hashCode方法,那么我也得到相同的意外结果.
按我的理解,如果我不重写equals
和hashCode
方法,或仅重写equals
方法则m1
和m2
对象应存储在不同的位置哈希值是不同的m1
和m2
对象.但在这种情况下,它没有发生.
有人可以解释一下为什么使用不同的哈希值,我的对象存储在同一个位置?
我使用过Java 8.
1> Mureinik..:
散列码具有巨大的范围,从Integer.MIN_VALUE
对Integer.MAX_VALUE
,而HashMap
通常具有少得多的存储桶(默认情况下,16条提出的新实例化的HashMap
,至少与OpenJDK的11).因此,完全可能,甚至预期,哈希码将发生冲突,并且多个对象将被添加到同一个桶中.但请注意,如果您没有覆盖hashCode()
此行为,则完全是偶然的,并且无法依赖.