如何使用Collection中的方法工作?

时间:2014-08-19 14:29:43

标签: java collections override

在这里我们重写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);
    }
}

4 个答案:

答案 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?