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

Java 用户定义类的equals()实现,java,equals,Java,Equals,我想知道为什么对于用户定义的类,equals返回False,而对于String类则不返回False。请注意,equals方法不会被重写 例如: public class EqualsTest { public static void main(String[] args) { Employee e1 = new Employee(); Employee e2 = new Employee(); e1.setId(100);

我想知道为什么对于用户定义的类,equals返回False,而对于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));
    }
}
我知道e1和e2的哈希代码是不同的。因此,equals方法的默认实现返回False

String s1 = new String();
String s2 = new String();
s1.equals(s2); // returns true;
我知道为什么用户定义的打印错误;我想知道如何准确地返回False

更正- 我倾向于说,在Employee类中,equals方法并没有被重写

…因为默认的equals方法对于String和Employee都是相同的

嗯,那不是真的。用于比较字符串内容的String类

/**
 * 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;
}

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

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

String类重写equals并检查其内容,返回它们是否相同


equals方法比较两个对象是否相等,如果相等,则返回true。Object类中提供的equals方法使用identity操作符==确定两个对象是否相等。对于基本数据类型,这将给出正确的结果。但是,对于对象,它不是。Object提供的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");
}
即使第一本书和第二本书引用两个不同的对象,该程序也会显示对象相等。它们被认为是相等的,因为所比较的对象包含相同的ISBN编号

如果标识运算符不适合您的类,则应始终重写equals方法

资料来源:[1]:

…因为默认的equals方法对于String和Employee都是相同的

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

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

阅读有助于理解。
当您重写equals时,也会重写hashcode。帮助理解重要性

我相信字符串类重写等于比较字符串的内容。因此,您的代码返回true


对于用户定义的对象,您需要基于用户定义对象的任何唯一元素重写equals方法。它可以是Id/名称,也可以是两者的组合。那么只有java能够根据用户定义的对象所包含的值来比较它们。

为什么说equals方法在String类中没有被重写。纠正我的错误equals方法在String类中被重写。谢谢Vishal我理解了区别。