オブジェクトの比較には、比較演算子ではなく、「equals」メソッドを使います。このequalsは、java.lang.Objectのメソッドです。
全てのクラスはObjectを継承しているために、全てのクラスでequalsが使えます。
自作クラスでは、extendsの指定をしていないケースが多いです。その際は、java.lang.Objectを直接継承していることになります。しかしjava.lang.Objectのequalsメソッドには注意が必要です。
java.lang.Objectのequalsメソッドでは、単に参照が同じか否かを比較演算子で比較しているだけです。オブジェクトの値などは一切考慮されていません。
public boolean equals(Object obj) { return (this == obj); }
そのため、自作クラスでequalsメソッドを使い、オブジェクトの値を比較させたい場合は、equalsメソッドをオーバーライドする必要があります。
「instanceof」は、オブジェクトに対して使える比較演算子です。基本型には使用できません。
instanceofは、左辺にオブジェクトを、右辺にクラスやインターフェースを書きます。そして、右辺が自身のクラスか、祖先のクラスやインターフェースならばtrueと判定されます。
オブジェクト instanceof 自身のクラス | true |
オブジェクト instanceof 祖先のクラス | true |
オブジェクト instanceof 祖先のインターフェース | true |
オブジェクト instanceof それ以外 | false |
以下、自作クラスにequalsの処理を実装する例を示します。
package sample; public class MyClass { public int n = 0; // equalsのオーバーライド @Override public boolean equals(Object obj) { if (obj instanceof MyClass) { MyClass mc = (MyClass)obj; return this.n == mc.n; } return false; } }