【问题标题】:Java: Check if two objects of the same class have identical valuesJava:检查同一类的两个对象是否具有相同的值
【发布时间】:2025-12-22 17:30:11
【问题描述】:

我想知道如何检查同一类的两个对象在每个属性中是否具有相同的值。

例如:

public class Person {
String name;
String surname;
String country;
int age;    

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

public boolean samePerson(Person person){
    //CODE
}


Person person1 = new Person("Abel", "Smith", "EEUU", 26);
Person person2 = new Person("Alexa", "Williams", "Canada", 30);
Person person3 = new Person("Abel", "Smith", "EEUU", 26);
Person person4 = new Person("Alexa", "Williams", "EEUU", 30)


person1.samePerson(person2) // return false
person1.samePerson(person3) // return true
person2.samePerson(person3) // return false
person2.samePerson(person4) // return false

我唯一能想到的就是一对一比较属性。有没有更简单的方法?

对不起我的英语

提前致谢

【问题讨论】:

  • 通常,你从对象类中重写equals方法,但是如果你认为如果两个人的所有属性值都相同,那么没有更简单的方法。
  • 覆盖 equals() 和 hashCode()
  • Read this answer。它有几种不同的探索方式:)

标签: java


【解决方案1】:

我唯一能想到的就是一对一比较属性。有没有更简单的方法?

很遗憾没有。您必须编写代码才能做到这一点。如果这样做,请考虑将该代码放入 equalshashCode 方法中。

【讨论】:

  • +1,首选为这种情况创建equals()hashCode()方法。
【解决方案2】:

没有更简单的方法。您必须实现自己的方式来执行此操作,因为它是您自己创建的类。

你有一个好的开始。您可以使用您的 samePerson() 方法来提供这个 功能,或者像@Thilo 所说,使用equalshashCode 方法。

应该是这样的:

public boolean samePerson(Person person){
   return this.name.equals(person.name) &&
          this.surname.equals(person.surname) &&
          this.country.equals(person.country) &&
          this.age == person.age;
}

也许有一些理智的空值检查和你需要的任何其他东西。

【讨论】:

    【解决方案3】:

    正确的答案是使用 equals() 和 hashCode(),但如果您正在寻找其他东西,您可以考虑为每个人引入一个 id - 也许是社会安全号码。然后可以在public boolean isSamePersonAs(Person person) 中实现人的比较并比较

    【讨论】:

      【解决方案4】:

      您需要指定必须如何比较对象

      并对其进行比较,正确实施 hashcode 方法。

      代码如下,添加到你的类中,你会得到想要的o/p。

      @Override
          public int hashCode() {
              int prime=31;
              int sum = prime*this.name.hashCode();
              sum=sum+this.surname.hashCode();
              sum=sum+this.country.hashCode();
              sum=sum+this.age;
              return sum;
          }
      
      @Override
          public boolean samePerson(Object p) {
          if(p==null)
              return false;
          if(! (p instanceof Person))
              return false;
          Person person = (Person)p;
      
              return this.name.equals(person.name) && this.surname.equals(person.surname) && this.country.equals(person.country) && this.age == person.age;
          }
      

      【讨论】:

      • 变量prime有什么用?
      【解决方案5】:

      大家试试这个,我想它对你有用

      ***********这是第一类“人”*********

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

      ********这是主类*******

      public class mainclass {
      
          public static void main(String arg[])
          {
              Person person1 = new Person("Abel", "Smith", "EEUU", 26);
              Person person2 = new Person("Alexa", "Williams", "Canada", 30);
              Person person3 = new Person("Abel", "Smith", "EEUU", 26);
              Person person4 = new Person("Alexa", "Williams", "EEUU", 30);
              System.out.println(samePerson(person1,person2)); 
              System.out.println(samePerson(person1,person3)); 
              System.out.println(samePerson(person2,person4)); 
              System.out.println(samePerson(person3,person4)); 
              System.out.println(samePerson(person1,person4)); 
      
          }
          static boolean samePerson(Person personA,Person personB)
          {    
            if(personA.name.equals(personB.name) && personA.country.equals(personB.country)&& personA.surname.equals(personB.surname )&& personA.age==personB.age )
               return true;  
            else
          return false;
      
         }
      }
      

      感谢和问候。

      【讨论】:

        【解决方案6】:

        通常你会为每个字段使用 getter。您应该在这里使用通用方式并通过每个实例的反射调用所有 getter,然后将它们与 equals 进行比较。

        @编辑 见这里:Java Reflection: How can i get the all getter methods of a java class and invoke them

        这里:http://tutorials.jenkov.com/java-reflection/getters-setters.html

        【讨论】:

        • 不。通常,您不会这样做。此处不建议使用反射。
        • 好吧,你不会自己做,但就是,例如Apache Commons EqualsBuilder 通过reflectionEquals 实现——你不这么认为吗?信息在:commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
        • 即使Apache Commons Lang 项目的EqualsBuilder 提供了反射方法,但这并不意味着您必须在所有 情况下使用它们。事实上,您应该尽可能避免使用它们。最好是提供一个equals的方法(这是这个方法的本意),并编写相应的逻辑。
        最近更新 更多