2010-02-23 108 views
6

如何覆盖对象类中的equals方法?Java重写Object equals()方法

即我有

class Person{ 

//need to override here 
public boolean equals (Object obj){ 

} 

我想将参数转换OBJ一种类型的人,但如果我这样做(人)目标文件将无法正常工作。

+1

注意,你必须要小心,如果你有一个非final类。通常,您应该使用'obj.getClass()== Person'而不是'instanceof Person'来检查运行时类。尽管可以编写一个让派生类型相同的合约(如'java.util.List')。如果你重写'equals',你也应该重写'hashCode',但这可能会提前一点。 – 2010-02-23 05:33:48

回答

8

你可以施放它里面的方法,只要确保是使用的

if(obj instanceof Person) 
{ 
    Person otherPerson = (Person) obj; 
    //Rest of the code to check equality 
} 
else 
{ 
//return false maybe 
} 
+0

而我想到Person otherPerson =(Person)obj; 谢谢 – user69514 2010-02-23 05:14:37

10

它其实比你想象的更复杂的情况下正确的类型。使用Eclipse(或任何您使用的IDE)自动生成equals方法;你会看到它包含一些检查并在进行比较之前进行强制转换。

而且在这里看到:http://www.javapractices.com/topic/TopicAction.do?Id=17

8
@Override 
public boolean equals(Object o) 
{ 
    if (o instanceof Person) 
    { 
     Person c = (Person) o; 
     if (this.FIELD.equals(c.FIELD)) //whatever here 
     return true; 
    } 
    return false; 
} 
+3

很多我不喜欢那个代码,但是我被迫为@ @ Override来+1。 – 2010-02-23 05:34:42

5

Regarding Object Comparison看看。

请注意,如果您覆盖equals()必须也覆盖hashCode()。 equals/hashCode约定是,如果两个对象相等,它们必须具有相同的哈希码。

3

如果您打算创建一个Person的子类,使用类似

如果(OBJ!= NULL & & obj.getClass()== Person.class)

,而不是的instanceof

+0

为什么会使用getClass()而不是instanceof? (只是好奇。) – Tom 2010-02-23 05:27:59

+2

例如如果员工延长人员;员工有其他字段,如ID等 您可能会得到一个误报使用person.equals(员工) – saugata 2010-02-23 11:05:11

+1

这不是你需要担心的误报,而是**违反反身性**。不管你使用什么,你基本上可以保证'新的Employee()。​​equals(new Person())'将会是false(Person不是Employee的一个实例)。如果反转参数,结果**必须相同,所以Person **不能等于它自己的子类(除非你在子类的equals()方法中做了一些非常时髦的事情)。 – 2010-02-24 12:28:01

2

使用getClass()而不是instanceof的唯一原因是,如果想要声明被比较的两个引用指向完全相同类的对象而不是实现相同基类的对象。

假设我们有一个EmployeeËManager(延伸Employee)。

m instanceof Employee会产生错误,m.getClass() == Employee.class会返回false。

在某些情况下,后者可能是首选,但很少在比较equals()hashCode()方法中的实例时。

0

还有一点可能是很好的了解,你重写后equals()方法(也hashcode())方法,你可以比较同一类的两个对象,如如下:

Person p1 = new Person(); 
Person p2 = new Person(); 

.... 

if (p1.equals(p2)) 

{ 
    // --- Two Persons are equal, w.r.t the fields you specified in equals method --- 

} 
0

我知道这是回答,但在我的旅行我发现这是最有效的方式来覆盖对象的比较,以确保它发生在全球范围相同:

@Override 
public boolean equals(Object o) { 
    return o instanceof Person && this.getSomeMagicalField().equals(((Person) o).getSomeMagicalField()); 
} 

,如果你不COMPAR荷兰国际集团字符串:

@Override 
public boolean equals(Object o) { 
    return o instanceof Person && this.getSomeMagicalField() == (Person) o).getSomeMagicalField(); 
} 
0

我更喜欢简单的,空安全(R)Objects.equals任何字段类型:

@Override 
public boolean equals(Object o) { 
    if (o instanceof Person) { 
     Person p = (Person) o; 
     return Objects.equals(p.FIELD, this.FIELD); 
    } 
    return false; 
}