比较或者实用contains都需要重写equals和hashcode方法

在 java 中,每个类都继承了 object 类,并且从 object 类中继承了一个默认的 equals() 方法。这个默认的 equals() 方法是比较两个对象的地址值是否相同,即他们是否指向内存中通体个对象。如果我们想要比较两个对象的引用地址是否相同,则需要重写 equals() 方法。

具体来说我们可以自定义一个 equals() 方法,用于比较自己顶替的类的实例是否相等。通常情况下,需要重写 equals() 方法时还需要同时重写 hashCode() 方法。这是因为在使用集合等数据结构时,他们往往基于 hasuCode() 方法来进行元素的查找和排序,因此,必须保证相等的对象具有相同的哈希码。

一下是一个示例代码,演示如何在 java 中重写 equals() 方法:

public class Person {
  private String name;
  private int age;
 
  public Person(String name,int age){
  this.name = name;
  this.age = age;
  }
 
@Override
  public boolean equals(Object obj){
   if(obj == null){
    return false;
   }
   if(this == obj){
    return true;
   }
   if(!(obj instanceof Person)){
    return false;
   }
   Person other = (Person)obj;
   return this.name == other.name && this.age == other.age; 
  }
 
@Override
  public int hashCode(){
   return Object.hash(name,age)
  }
}

在上述示例代码中,重写了 equals90 方法和 hashCode() 方法。equals() 方法首先判断传入的参数是否为 null,又判断传入的参数指向的是否是当前对象,如果是,则返回 true;如果不是,则判断传入的参数是否为 Person 类型,如果不是,则返回 false;如果是,就将 obj 强转为当前类的对象,比较两个对象的属性值是否相等。hashCode() 方法则使用 Java7 引入的 Objects.hash() 方法来对属性值计算哈希码。

需要注意的是,在重写 equals() 方法时,应该遵循以下原则:

  1. 自反性:对于任何非空的引用值 x,x.equals(x) 都应该返回 true。

  2. 对称性:对于任何非空的引用值 x 和 y, 如果 x.equals(y) 返回 true,则 y.equals(x) 也应该返回 true。

  3. 传递性:对于任何非空的引用值 x,y 和 z, 如果 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true, 则 x.equals(z) 也返回 true。

  4. 一致性:对于任何非空的引用值 x 和 y,多次调用 x.equalas(y) 应该始终返回相同的结果。

  5. 非空性:对于任何非空的引用值 x,x.equals(null) 应该返回 false。

通过书写 equals() 方法可以使得自定义类的实例可以被正确比较,从而更方便程序的编写和开发。

你可能感兴趣的:(java,java)