如何覆盖java中的equals方法

我想重写java中的equals方法。 我有一个班主要有两个数据字段名字和年龄的人。 现在我想重写equals方法,以便我可以检查2个人对象。

我的代码如下

public boolean equals(People other){ boolean result; if((other == null) || (getClass() != other.getClass())){ result = false; } // end if else{ People otherPeople = (People)other; result = name.equals(other.name) && age.equals(other.age); } // end else return result; } // end equals 

但是,当我写age.equals(other.age)它给了我错误的等于方法只能比较字符串和年龄是整数。

请帮我解决这个问题。

感谢提前。

我使用==操作符建议和我的问题解决。 非常感谢每一个努力帮助我。

 //Written by K@stackoverflow public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here ArrayList<Person> people = new ArrayList<Person>(); people.add(new Person("Subash Adhikari",28)); people.add(new Person("K",28)); people.add(new Person("StackOverflow",4)); people.add(new Person("Subash Adhikari",28)); for (int i=0;i<people.size()-1;i++){ for (int y=i+1;y<=people.size()-1;y++){ System.out.println("-- " + people.get(i).getName() + " - VS - " + people.get(y).getName()); boolean check = people.get(i).equals(people.get(y)); System.out.println(check); } } } } //written by K@stackoverflow 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 (!Person.class.isAssignableFrom(obj.getClass())) { return false; } final Person other = (Person) obj; if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) { return false; } if (this.age != other.age) { return false; } return true; } @Override public int hashCode() { int hash = 3; hash = 53 * hash + (this.name != null ? this.name.hashCode() : 0); hash = 53 * hash + this.age; return hash; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

输出:

跑:

– Subash Adhikari – VS – K false

– Subash Adhikari – VS – StackOverflow false

– Subash Adhikari – VS – Subash Adhikari true

– K – VS – StackOverflow false

– K – VS – Subash Adhikari错误

– StackOverflow – VS – Subash Adhikari错误

– 建立成功(总时间:0秒)

首先:你不是equals ,你超负荷

没有看到实际的age声明,很难说为什么你会得到这个错误。

我不确定细节,因为你还没有发布整个代码,但是:

  • 记得也要重写hashCode()
  • equals方法应该有Object ,而不是People作为它的参数类型。 目前,你正在重载,而不是重写,equals方法,这可能不是你想要的,特别是考虑到你稍后检查它的类型。
  • 你可以使用instanceof来检查它是一个People对象,例如if (!(other instanceof People)) { result = false;}
  • equals用于所有对象,但不是基元。 我认为你的意思是年龄是一个int (原始),在这种情况下只使用== 。 请注意,Integer(大写“I”)是一个Object,它应该与equals进行比较。

在Java中重写equals和hashCode时应该考虑哪些问题? 更多细节。

由于我猜测ageint类型的:

 public boolean equals(Object other){ boolean result; if((other == null) || (getClass() != other.getClass())){ result = false; } // end if else{ People otherPeople = (People)other; result = name.equals(otherPeople.name) && age == otherPeople.age; } // end else return result; } // end equals 
 @Override public boolean equals(Object that){ if(this == that) return true;//if both of them points the same address in memory if(!(that instanceof People)) return false; // if "that" is not a People or a childclass People thatPeople = (People)that; // than we can cast it to People safely return this.name.equals(thatPeople.name) && this.age == thatPeople.age;// if they have the same name and same age, then the 2 objects are equal unless they're pointing to different memory adresses } 

如果age是int,则应该使用==,如果它是Integer对象,则可以使用equals()。 如果您覆盖equals,则还需要实现散列码方法。 对象的详细信息可以在Object的javadoc中找到,也可以在web的各个页面中找到。

方法equals定义了一个Object类型的方法参数,其返回类型是boolean。

 Don't change the name of the method, its return type, or the type of method parameter 

当你在你的类中定义( 覆盖 )这个方法来比较两个对象时。

 public boolean equals(Object anObject) { ... }