Java 用户定义类的equals()实现
我想知道为什么对于用户定义的类,equals返回False,而对于String类则不返回False。请注意,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);
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我理解了区别。