两个对象hashCode相等,引用地址相等吗?那么这两个对象equals一定相同吗?

注意:hashCode可以理解为对象在计算机的唯一地址。

结论:

  1. 两个对象equals相等,hashCode一定相等
  2. 两个对象 == 相等,hashCode一定相等
  3. 两个对象 == 不相等,hashCode有可能相等

实体类Animal

import java.util.Objects;

public class Animal {
    
    

    private String name;
    private Integer age;

    public Animal() {
    
    
    }

    public Animal(String name, Integer age) {
    
    
        super();
        this.name = name;
        this.age = age;
    }
    /*
    * Animal类重写equals、hashCode方法
    * 当Animal的name相同时我认为这两个对象是相同的
    * */
    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return Objects.equals(name, animal.name);
    }
    @Override
    public int hashCode() {
    
    
        return Objects.hash(name);
    }
}

测试代码

Animal animal = new Animal("zz", 18);
Animal animal1 = new Animal("zz", 14);
System.out.println(animal == animal1);
System.out.println(animal.equals(animal1));
System.out.println(animal.hashCode());
System.out.println(animal1.hashCode());

// console输出结果
false
true
3935
3935

以上结果可以看出两个对象的equals相等,hashCode相等,但是 == 返回的是false,通过new 出来的对象在堆上地址是唯一的。

hashCode()与equals()的相关规定

  1. 如果两个对象相等,则对象的hashCode必须相等
  2. 如果两个对象相等,对其中一个对象调用equals()必须返回true。也就是说,若a.equals(b),则b.equals(a)
  3. 如果两个对象有相同的hashCode值,它们也不一定是相等的。但若两个对象相等,则hashCode值一定相等
  4. 因此若equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. hashCode()的默认行为是对在heap上的对象产生的独特的值。如果你没有override过hashCode(),则该class的两个对象怎样都不会被认为是相同的
  6. equals()的默认行为是执行==的比较。也就是说回去测试两个引用是否对heap上的同一个对象。如果equals()没有被覆盖过,两个对象永远不会被视为相等,因为不同的对象有不同的字节组合
  7. a.equals(b) 必须与 a.hashCode() == b.hashCode()等值,但 a.hashCode() == b.hashCode()不一定要与a.equals(b) 等值

读书随笔,每天进步一点点

猜你喜欢

转载自blog.csdn.net/weixin_45582733/article/details/111240423