2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java Silver】equalsメソッドについて

Last updated at Posted at 2020-10-04

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クラスに定義されているメソッド一覧
スクリーンショット 2020-10-04 18.36.43 1.png

##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は発生しません。

#参考

Java equalsでnullまたは空文字を比較するサンプル

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?