HashSet 和 HashMap 一直都是 JDK 中最常用的两个类,HashSet 要求不能存储相同的对象,HashMap 要求不能存储相同的键。 那么 Java 虚拟机是如何判断 HashSet 中相同对象、HashMap 中相同键的呢?在 Java 中任何一个对象都具备 equals 和 hashcode 这两个方法,因为他们是在 Object 类中定义的。 equals 方法用来判断两个对象是否相同,如果相同则返回 true,否则返回 false。 hashcode 方法返回一个 int 数,在Object 类中的默认实现是将该对象的内部地址转换成一个整数返回。
规范1:若重写 equals 方法,有必要重写 hashcode 方法,确保 equals 方法结果为 true 的两个对象具备相等的 hashcode 值。
规范2:如果 equals 方法返回 false,即两个对象不相同,并不要求对这两个对象调用 hashcode 方法得到两个不相同的数。
代码测试
public class Father {
public String name;
public int age;
public Father(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
System.out.println("判断equals");
return true;
}
@Override
public int hashCode() {
System.out.println("判断hashcode");
return 1;
}
}
测试类
public class Test {
public static void main(String[] args) {
Map<Father,Object> map = new HashMap<Father, Object>();
map.put(new Father("fei", 23), new Object());
map.put(new Father("qiang", 22), new Object());
System.out.println(map.size());
}
}
结果:
判断hashcode
判断hashcode
判断equals
1