在这里我们重写equals()然后它应该比较内容,但它是在这里比较引用。为什么会这么发生?
import java.util.Vector;
public class Lab1281 {
public static void main(String[] args) {
Vector v = new Vector();
Student12 stu = new Student12(56);
v.addElement(stu);
System.out.println(v.contains(new Student12(56)));
}
}
class Student12 {
int sid;
public Student12(int sid) {
super();
this.sid = sid;
}
public boolean equals(Object obj) {
System.out.println("**equals()**");
return super.equals(obj);
}
}
答案 0 :(得分:0)
查找源代码告诉我们,该向量确实转到了AbstractList的超类for equals。
public boolean More ...equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while(e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
你可以做的第一件事就是比较参考文献。
答案 1 :(得分:0)
您的equals()
方法只是返回super.equals(obj);
,即equals()
上的Object
实施:
public boolean equals(Object obj) {
System.out.println("**equals()**");
return super.equals(obj); // calls Object#equals()
}
如果我们查看Object#equals()
的实现,我们会看到它正在进行直接对象引用比较:
/**
* Indicates whether some other object is "equal to" this one.
*
* ...
*
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
由于您在测试语句中创建了新 Student12
对象,因此返回false。
您需要检查班级中某些相关州的equals()
方法:
@Override
public boolean equals(Object obj) {
System.out.println("**equals()**");
if (!(obj instanceof Student12)) { return false; }
return ((Student12)obj).sid == this.sid;
}
答案 2 :(得分:0)
因为你正在调用super.equals。我将使用对象等于。它的参考。相反,调用超级你必须编写自己的equals方法。
答案 3 :(得分:0)
supper class equal()方法默认情况下只使用==运算符来比较对象,并且你重写了超类的equal()方法,所以它只会比较对象的引用而不是实际的对象内容。 要比较实际的对象内容,您应该拥有自己的实现(通过使用您的类的成员)。
class abc{
int a;
string b
...
...
...
public boolean equal(Object obj){
...
...
this.a==obj.a; //or you can use equal() method here to compare the particular member
this.b==obj.b;
}
}
或者你可以在这里看到 Why do I need to override the equals and hashCode methods in Java?