我想知道为什么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方法没有被覆盖。
答案 0 :(得分:3)
...因为默认的equals()方法对于String和Employee都是相同的。
嗯,事实并非如此。 String
类overrides 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()
并检查其内容,并返回它们是否相同。
答案 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才能根据它们包含的值来比较用户定义的对象。