【发布时间】:2019-06-27 02:25:41
【问题描述】:
直到今天我还相信两个具有相同哈希码的对象意味着它们都具有相同的内存位置。但下面的一段代码完全讲述了一个不同的故事:
学生实体: 公共类 Student 实现 Comparable {
int id;
int marks;
String Subject;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
public String getSubjects() {
return Subject;
}
public void setSubject(String subject) {
Subject = subject;
}
public Student() {
}
public Student(int id, String subject, int marks) {
super();
this.id = id;
this.marks = marks;
Subject = subject;
}
@Override
public int compareTo(Student o) {
if (this.getId()>(o.getId()))
return 1;
if (this.getId()<(o.getId()))
return -1;
return 1;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((Subject == null) ? 0 : Subject.hashCode());
result = prime * result + id;
result = prime * result + marks;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (Subject == null) {
if (other.Subject != null)
return false;
} else if (!Subject.equals(other.Subject))
return false;
if (id != other.id)
return false;
if (marks != other.marks)
return false;
return true;
}
}
在 Hashmap 中输入 Duplicates 以检查覆盖 equals & hashcode() 是否有效:
public class TestHashSet3 {
static Student s1;
static Student s2;
static Student s3;
public static void main(String[] args) {
setStudent();
testSet();
testMap();
}
static void testMap() {
Map<Student, String> empMap = new HashMap<>();
empMap.put(s1, "Arun");
empMap.put(s2, "Shivam");
empMap.put(s3, "Varun");
System.out.println("HashMap executed = ");
for (Map.Entry<Student, String> obj : empMap.entrySet()) {
System.out.println(obj + " ");
}
}
static void testSet() {
Set<Student> set = new HashSet<>();
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println("HashSet executed = ");
for (Student student : set) {
System.out.println(student + " ");
}
}
static void setStudent() {
s1 = new Student(124, "Maths", 50);
s2 = new Student(124, "Maths", 50);
s3 = new Student(124, "Maths", 50);
}
}
在最后的截图中,我们可以看到这个 ==obj 被证明是假的。但是为什么呢?
【问题讨论】:
-
请发布您的代码,而不是代码截图。
-
我们更喜欢文字而不是屏幕截图
-
添加代码请立即查看
-
不,你学错了(数学)课:使用相同的 hashCode 不同的对象/输入总是 可能(根据“hash”的定义代码”)..相反(相同的输入 -> 相同的哈希码)应该始终保持(在“良好的哈希码”中)..您的哈希码在这些术语中是“坏的”。
-
“内存位置”不应该是影响大多数 Java 编程的概念。您肯定需要的最接近的概念是“这两个引用是对同一对象还是对不同对象?”。当然,正如已经明确指出的那样,相等的 hashCodes 肯定并不意味着它们是同一个对象。
标签: java hashmap equals hashcode