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 メソッドは、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値 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 に答える