【发布时间】:2019-05-23 03:55:48
【问题描述】:
我有一个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 表数组的相同索引位置。以下是调试模式下的预期结果。
但是如果我不重写 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;
}
调试模式下的输出
如果我不重写 equals 和 hashCode 方法,那么我也会得到同样的意外结果。
根据我的理解,如果我不覆盖 equals 和 hashCode 方法或只覆盖 equals 方法,那么 m1 和 m2 对象应该存储在不同的位置,因为哈希值不同m1 和 m2 对象。但在这种情况下,它没有发生。
谁能解释一下为什么使用不同的哈希值,我的对象存储在同一个位置?
我使用过 Java 8。
【问题讨论】: