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

use*_*667 0 java equality reference

我读到.equals()比较对象的值,而==比较引用(即 - 变量指向的内存位置).请参见:Java中== vs 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:(
没什么)

不应该打印2吗?

jh3*_*314 6

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

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

类Object的equals方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用`if(obj.getClass()!= getClass())`而不是使用`if(!(obj instanceof Vertex))`,因为后者允许子类等于它的父类. (2认同)