-5

我想知道为什么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()fore1e2是不同的。因此,equals 方法的默认实现返回 False。

String s1 = new String();
String s2 = new String();
s1.equals(s2); // returns true;

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

更正——我倾向于说在 Employee 类中 equals 方法没有被覆盖。

4

5 回答 5

3

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

好吧,那不是真的。该类覆盖String以比较字符串的内容。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;
}
于 2013-08-06T04:28:45.353 回答
0

我相信你说的对,然后你的问题就错了。

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

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

源 - Oracle 文档

于 2013-08-06T04:30:24.343 回答
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

于 2013-08-06T04:35:02.067 回答
0

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

这不是真的,String类重写equals()方法来检查字符串的内容。

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

阅读覆盖用户定义类的 equals 方法以便更好地理解。并且当您覆盖时equals()也覆盖hashcode()这篇文章有助于理解意义

于 2013-08-06T04:37:12.670 回答
0

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

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

于 2013-08-06T04:46:01.403 回答