如何覆盖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时应该考虑哪些问题? 更多细节。
由于我猜测age
是int
类型的:
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) { ... }