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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-17
  • 2021-10-09
猜你喜欢
  • 2021-10-12
  • 2021-06-20
  • 2021-11-29
  • 2018-04-01
  • 2022-12-23
  • 2021-12-04
相关资源
相似解决方案