
「==」と「equals()」の違い
はじめに
前回に引き続き、「プログラミングを習いたての時に難しかったと感じていた内容を数年経った今の私なりに解説する」シリーズです!!!!
いきなりですが下記のコードを見て、比較結果を考えてみてください。
String a = new String("Java");
String b = new String("Java");
// 比較結果
System.out.println(a == b);
System.out.println(a.equals(b));a == bについてaもbもJavaなんだからどう見ても同じ(true)だろ!a.equals(b)はあんまり自信ないけどequalとか言ってるし同じっしょ!と思っていました。
しかし、上記の結果は、
false
trueになります。当時は「え、なんで?」と思ったのを覚えています。どちらも「同じかどうか」を確認しているように見えるのに、、、
今回は、そんな「==とequals()って何が違うの?」について、まとめていきたいと思います。
「==」VS「equals()」
ひとことで言うと、
「==」は同じものを指しているか、「equals()」は論理的に同じものかを比較します。
先ほどのコードをイメージすると、
a ‐‐‐→ [ "Java" ]
b ‐‐‐→ [ "Java" ]aとbは同じ「Java」という文字列を持っています。
しかし、それぞれ別のオブジェクトです。
そのため、
a == b
は「同じオブジェクト?」という比較になるのでfalse。
一方、
a.equals(b)
はStringが持っている「文字列の内容が同じなら等しい」というルールに従って比較するのでtrueになります。
つまり、
== ---→ 同じもの?
equals() --→ 同じ内容・意味?と考えると分かりやすいです。
「同じ」とは何か?
①山田さんと山田さん
②目の前にいる山田さんと、昨日会った山田さん①は名前は同じですが、別人かもしれません。
②は同じ人物です。
これらはすべて「同じ」という言葉を使っていますが、何を基準にするかは違います。
Javaも同じです。
「何をもって同じか?」という基準(ルール)が決めています。
まとめ
大切なのは、
「何を基準に『同じ』と言っているのか?」
と考えることだと思います。
Javaでは、
== → 同じオブジェクト?
equals() → 論理的に同じ?というような違いがあります。