.equals()和==之间有什么区别?

时间:2013-07-31 17:00:16

标签: java reference equality

我读到.equals()比较对象的值,而==比较引用(即 - 变量指向的内存位置)。见这里:What is the difference between == vs equals() in Java?

但请注意以下代码:

package main;

public class Playground {

    public static void main(String[] args) {
        Vertex v1 = new Vertex(1);
        Vertex v2 = new Vertex(1);

        if(v1==v2){
            System.out.println("1");
        }
        if(v1.equals(v2)){
            System.out.println("2");
        }
    }
}

class Vertex{
    public int id;

    public Vertex(int id){
        this.id = id;
    }
}

输出:
(没有)

不应该打印2?

2 个答案:

答案 0 :(得分:6)

您需要为.equals()类实现自己的Vertex方法。

默认情况下,您使用的是Object.equals方法。 From the docs, this is what it does:

  

类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

您可以这样做:

@Override
public boolean equals(Object obj) {
    if (obj == null) return false;
    if (obj.getClass() != getClass()) return false;
    Vertex other = (Vertex)obj;
    return (this.id == other.id);
}

答案 1 :(得分:3)

您需要覆盖equals()的默认实现。默认实现是Object#equals()

public boolean equals(Object obj) {
    return (this == obj);
}

被覆盖的版本将是这样的:

@Override
public boolean equals(Object obj)
{
    if(obj == this) return true;
    if(obj == null) return false;
    if(obj.getClass() != getClass()) return false;
    return ((Vertex) obj).id == this.id;
}