Java Silverを勉強するにあたって、覚えておくべきequalsメソッドにまつわる内容をまとめます。
##equalsメソッドとは
<公式ドキュメント> equalsメソッド
equalsメソッドはjava.lang.Objectクラスに定義されているメソッドである。
##通常の挙動
a.equals(b);
変数aに格納されているインスタンスと変数bに格納されているインスタンスが同じ値を持っているか確認する**(同値性)**
※インスタンスの同一性(同じ参照を持っているか)を確認するには==演算子を利用する
internメソッドを使って、同値だが同一ではないインスタンスを==演算子で比較すると、trueを返す
String a = "abc";
String b = new String("abc");
System.out.println(a == b); //falseが返る
System.out.println(a.intern() == b.intern()); //trueが返る
これは、internメソッドが、コンスタントプールを含む、メモリ内の文字列を探して再利用するためのメソッドであるため。
コンスタントプール とは、文字リテラルがプログラム内に再び登場すると、過去に作成した同じ文字列インスタンスへの参照が使い回しされること
##Objectクラスのequalsメソッド
equalsメソッドはObjectクラスに定義されているので、全てのクラスが持っている。しかし、Objectクラスのequalsメソッドだけは、同値性ではなく同一性を判定するよう定義されている。定義は次の通り。
public boolean equals(Object obj){
return (this == obj);
}
同値性の確認方法は各クラスによって異なるため、equalsメソッドはオーバーライドして使うことを前提としている。
オーバーライドしなかった場合、同値性ではなく同一性を検証する!!!
##java.lang.Objectクラスに定義されているメソッドであるということ
java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライド
→コンパイルエラーとなる
故に、equalsメソッドをオーバーライドする際は、クラスでオーバーライドする必要がある。
※java.lang.Objectクラスに定義されているメソッド一覧
##nullを引数にとってもNullPointerExceptionは発生しない
equalsメソッドにnullを渡しても、NullPointerExceptionは発生しない
<公式ドキュメント>
x.equals(null)はfalseを返します。
<Java equalsでnullまたは空文字を比較するサンプル>より
a.equals(b)のとき、aがnullの場合は、NullPointerExceptionが発生します。
a.equals(b)のとき、aがnullではなくbがnullの場合は、falseを返します。
Java7で追加されたObjects.equals(a,b)は、a,bがnullでもNullPointerExceptionは発生しません。
#参考