用户定义的类的equals()实现

时间:2013-08-06 04:23:23

标签: java equals

我想知道为什么equals()为用户定义的类而不是String类返回False。 (请注意,equals()方法未被覆盖。)

例如:

public class EqualsTest {
    public static void main(String[] args) {

        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);
        //Prints false in console
        System.out.println(e1.equals(e2));
    }
}

我知道hashCode()e1的{​​{1}}不同。因此,equals方法的默认实现返回False。

e2

我知道为什么用户定义打印False;我想确切地知道如何返回False。

corrected-- 我倾向于说在Employee类中equals方法没有被覆盖。

5 个答案:

答案 0 :(得分:3)

  

...因为默认的equals()方法对于String和Employee都是相同的。

嗯,事实并非如此。 Stringoverrides equals()用于比较字符串的内容。

/**
 * Compares this string to the specified object.  The result is {@code
 * true} if and only if the argument is not {@code null} and is a {@code
 * String} object that represents the same sequence of characters as this
 * object.
 *
 * @param  anObject
 *         The object to compare this {@code String} against
 *
 * @return  {@code true} if the given object represents a {@code String}
 *          equivalent to this string, {@code false} otherwise
 *
 * @see  #compareTo(String)
 * @see  #equalsIgnoreCase(String)
 */
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

我相信你说得对,那你问题就错了。

equals()未被覆盖的事实是它返回false的原因。 equals()类的object用于检查两个引用变量是否访问内存中的同一对象。您需要使用return (e1.getID == e2.getID);

覆盖它

String类会覆盖equals()并检查其内容,并返回它们是否相同。

Source - Oracle Documentation

答案 2 :(得分:0)

equals()方法比较两个对象是否相等,如果它们相等则返回true。 Object类中提供的equals()方法使用标识运算符(==)来确定两个对象是否相等。对于原始数据类型,这会给出正确的结果。但是,对于对象,它没有。 Object提供的equals()方法测试对象引用是否相等 - 即,如果比较的对象是完全相同的对象。

要测试两个对象在等效意义上是否相等(包含相同的信息),必须覆盖equals()方法。以下是覆盖equals()的Book类的示例:

public class Book {
    ...
    public boolean equals(Object obj) {
        if (obj instanceof Book)
            return ISBN.equals((Book)obj.getISBN()); 
        else
            return false;
    }
}

考虑这个代码来测试Book类的两个实例是否相等:

Book firstBook  = new Book("0201914670");
Book secondBook = new Book("0201914670");
if (firstBook.equals(secondBook)) {
    System.out.println("objects are equal");
} else {
    System.out.println("objects are not equal");
}

此程序显示对象相等,即使firstBook和secondBook引用了两个不同的对象。它们被认为是相同的,因为比较的对象包含相同的ISBN号。

如果身份运算符不适合您的类,则应始终覆盖equals()方法。

来源:[1]:http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

答案 3 :(得分:0)

  

...因为默认的equals()方法对于String和Employee都是相同的。

不是这样,String类会覆盖equals()方法来检查字符串的内容。

如果你没有覆盖你的类的equals()方法,那么将使用对象类equals()方法,如果两个引用都引用同一个对象,则返回true。因此,为了检查相等性,您需要为Employee类覆盖它。

阅读overriding equals method for user defined classes以获得良好的理解。 当你覆盖equals()时,也会覆盖hashcode()This article有助于理解重要性

答案 4 :(得分:0)

我相信String类覆盖equals()来比较String的内容。所以你的代码返回“true”。

如果是用户定义的对象,则需要根据用户定义对象的任何唯一元素覆盖equals方法。它可以是Id / Name或两者的组合。那么只有java才能根据它们包含的值来比较用户定义的对象。