0

我读到 .equals() 比较对象的值,而 == 比较引用(即 - 变量指向的内存位置)。请参见此处:Java 中 == 与 equals() 有什么区别?

但请注意以下代码:

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吗?

4

2 回答 2

6

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

默认情况下,您正在使用该Object.equals方法。 从文档中,这就是它的作用:

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 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);
}
于 2013-07-31T17:01:48.837 回答
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;
}
于 2013-07-31T17:02:22.077 回答