返回

手撕代码判断两个对象是否相等

前端

在实际项目开发中,判断两个对象是否相等可能是比较常见的需求了,有些小伙伴会使用第三方库实现,有些小伙伴会自己手动实现。不管怎么实现,只要能满足项目需求,那就是好样的。

1. Object类equals方法

在Java中,Object类提供了一个equals方法,用于比较两个对象是否相等。该方法的声明如下:

public boolean equals(Object obj)

如果两个对象相等,则返回true;否则,返回false。

2. Java对象比较

Java对象比较主要分为浅比较和深比较。

  • 浅比较 :浅比较只比较两个对象的引用是否相等。如果两个对象的引用相等,则认为这两个对象相等;否则,认为这两个对象不相等。
  • 深比较 :深比较比较两个对象的属性值是否相等。如果两个对象的属性值都相等,则认为这两个对象相等;否则,认为这两个对象不相等。

3. 比较对象值

比较对象值可以使用equals方法。例如,以下代码比较两个字符串对象是否相等:

String str1 = "Hello";
String str2 = "Hello";

if (str1.equals(str2)) {
  System.out.println("两个字符串相等");
} else {
  System.out.println("两个字符串不相等");
}

输出结果为:

两个字符串相等

4. 比较对象引用

比较对象引用可以使用==操作符。例如,以下代码比较两个字符串对象的引用是否相等:

String str1 = "Hello";
String str2 = "Hello";

if (str1 == str2) {
  System.out.println("两个字符串引用相等");
} else {
  System.out.println("两个字符串引用不相等");
}

输出结果为:

两个字符串引用不相等

这是因为,虽然两个字符串对象的值相同,但是它们的引用不同。

5. hashCode方法

hashCode方法是Object类提供的另一个方法,用于返回对象的哈希码。哈希码是一个整数,用于唯一标识一个对象。两个对象如果相等,那么它们的哈希码也必须相等。但是,两个对象不相等,它们的哈希码也不一定不相等。

6. 浅比较和深比较的示例代码

以下代码演示了浅比较和深比较的示例代码:

public class Main {

  public static void main(String[] args) {
    // 浅比较
    String str1 = "Hello";
    String str2 = "Hello";

    if (str1 == str2) {
      System.out.println("两个字符串引用相等");
    } else {
      System.out.println("两个字符串引用不相等");
    }

    // 深比较
    Person person1 = new Person("张三", 20);
    Person person2 = new Person("张三", 20);

    if (person1.equals(person2)) {
      System.out.println("两个对象相等");
    } else {
      System.out.println("两个对象不相等");
    }
  }
}

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 (this == obj) {
      return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
      return false;
    }
    Person person = (Person) obj;
    return name.equals(person.name) && age == person.age;
  }
}

输出结果为:

两个字符串引用相等
两个对象不相等

这是因为,虽然两个字符串对象的引用相等,但是它们的属性值不同。而两个Person对象的属性值相同,但是它们的引用不同。