Java 比较两个对象

Java 比较两个对象

介绍

在Java中,可以使用equals()方法来比较对象,该方法根据对象的属性来判断是否相等。在Java中比较对象时,重写类中的equals()方法非常重要,以确保根据所需的属性进行比较。

该Java程序通过重写equals()方法来比较两个Person类型的对象,根据它们的姓名和年龄属性进行比较。先使用equals()方法检查对象是否属于同一个类,然后比较姓名和年龄属性。如果两个属性都匹配,方法返回true,表示对象相等。如果任何一个属性不同,方法返回false,表示对象不相等。

方法

有两种标准方法

  • 使用equals()方法
    • 没有重写方法

    • 有重写方法

  • 使用hashCode()和equals()方法

示例1:重写equals()方法

在类中重写equals()方法允许根据属性自定义比较对象。

步骤

  • 首先我们定义一个Person类,有两个私有实例变量:姓名和年龄。

  • 我们为Person类定义一个构造函数,该构造函数接受姓名和年龄,并使用这些值初始化实例变量。

  • 我们在Person类中重写equals()方法,根据姓名和年龄比较两个Person对象。equals()方法接受一个Object参数,我们首先检查该参数不为null且是Person类的实例。然后将对象强制转换为Person对象,并将其姓名和年龄属性与当前对象的姓名和年龄属性进行比较。

  • 在main()方法中,我们创建两个具有不同姓名和年龄值的Person对象。

  • 我们调用equals()方法对第一个Person对象进行比较,将第二个Person对象作为参数传递。equals()方法返回一个boolean值,表示这两个对象是否相等。

  • 最后,我们使用System.out.println()将比较结果打印到控制台。

public class ObjectComparator {

   public static void main(String[] args) {

      // Create two objects to compare
      Person person1 = new Person("Alice", 25);
      Person person2 = new Person("Bob", 30);

      // Compare the two objects
      boolean areEqual = person1.equals(person2);
      System.out.println("Are the two objects equal? " + areEqual);
   }
}

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 (!(obj instanceof Person)) return false;
      Person otherPerson = (Person) obj;
      return this.name.equals(otherPerson.name) && this.age == otherPerson.age;
   }
}

解释

在这个示例中,我们创建了两个不同名字和年龄的Person对象,然后调用第一个对象的equals方法来比较它与第二个对象。equals方法在Person类中定义,并且检查这两个对象的名字和年龄属性是否相同。最后,我们将比较结果打印到控制台上。

输出

Are the two objects equal? false

示例2:没有覆写equals()方法

没有覆写equals()方法,对象将基于它们的引用进行比较,而不是它们的属性。

方法

  • 首先我们定义一个Person类,有两个私有实例变量:name和age。

  • 我们为Person类定义一个构造函数,该构造函数接受name和age参数,并用这些值初始化实例变量。

  • 在main()方法中,我们创建两个具有相同name和age值的Person对象。

  • 我们在第一个Person对象上调用equals()方法,将第二个Person对象作为参数传入。由于我们没有覆写Person类中的equals()方法,所以使用了从Object类继承的equals()方法的默认实现。该实现检查两个对象是否为同一对象(即具有相同的内存地址),如果是则返回true。由于person1和person2对象具有不同的内存地址,equals()方法返回false。

  • 最后,我们使用System.out.println()将比较结果打印到控制台。

public class ObjectComparator {

   public static void main(String[] args) {

      // Create two objects to compare
      Person person1 = new Person("Alice", 25);
      Person person2 = new Person("Alice", 25);

      // Compare the two objects
      boolean areEqual = person1.equals(person2);
      System.out.println("Are the two objects equal? " + areEqual);
   }
}

class Person {

   private String name;
   private int age;

   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }
}

解释

在这个示例中,我们创建了两个名字和年龄都相同的Person对象,然后调用第一个对象的equals方法来将其与第二个对象进行比较。由于我们没有在Person类中重写equals方法,所以使用了从Object类继承的equals方法的默认实现。这个实现检查两个对象是否是同一个对象(即具有相同的内存地址),如果是,则返回true。由于person1和person2对象具有不同的内存地址,equals方法返回false。最后,我们将比较的结果输出到控制台。

输出

Are the two objects equal? false

示例3:使用hashCode()和equals()方法

在未重写equals()方法的情况下,对象是根据它们的引用而不是属性进行比较的。

方法

  • 我们创建了两个Person类的对象person1和person2,它们具有相同的姓名和年龄。

  • 然后我们在person1上调用hashCode()和equals()方法。

  • 在Person类中,我们重写hashCode()方法,使用Objects.hash()方法基于对象的姓名和年龄属性生成哈希码。

  • 然后我们重写equals()方法,根据姓名和年龄属性比较两个Person对象。该方法首先检查对象是否属于相同的类,然后使用Objects.equals()方法检查它们的姓名和年龄属性是否相等。

  • 在main()方法中,我们使用&&运算符使用hashCode()方法检查person1和person2的哈希码是否相同,并且使用equals()方法检查它们是否相等。

  • 最后,我们打印出一个消息来指示对象是否相等。

public class ObjectComparator {

   public static void main(String[] args) {

      // Create two objects to compare
      Person person1 = new Person("Alice", 25);
      Person person2 = new Person("Alice", 25);

      // Compare the two objects using hashCode and equals methods
      boolean areEqual = person1.hashCode() == person2.hashCode() && person1.equals(person2);
      System.out.println("Are the two objects equal? " + areEqual);
   }
}

class Person {

   private String name;
   private int age;

   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }

   @Override
   public int hashCode() {
      return Objects.hash(name, age);
   }

   @Override
   public boolean equals(Object obj) {
      if (this == obj)
         return true;
      if (!(obj instanceof Person))
         return false;
      Person other = (Person) obj;
      return Objects.equals(name, other.name) && age == other.age;
   }
}

解释

在这个示例中,我们创建了两个具有相同姓名和年龄的Person对象,然后调用第一个对象的hashCode()和equals()方法来比较它和第二个对象。

在Person类中,我们重写了hashCode()和equals()方法,以基于它们的姓名和年龄属性来比较对象。hashCode()方法返回姓名和年龄属性的组合的哈希码,equals()方法检查对象是否属于同一类并具有相同的姓名和年龄属性。

最后,我们使用&&运算符来检查两个对象的哈希码是否相同,以及equals()方法是否返回true。如果这两个条件都成立,我们就打印出对象是相等的。否则,我们打印出对象不相等。

输出

The two person objects are equal

结论

  • Java程序使用重写的Person类中的equals()方法基于其属性来比较两个Person对象。

  • 该程序展示了定制对象比较的重要性,并突出了Java在实现自定义比较逻辑方面的灵活性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程