Kotlinには、オブジェクトを比較する場合に1 == 1
と1 === 1
の二種類があり、それぞれどう違うのかってのが話題に上がったので調べてみました。
(=)イコールとは?
等号(とうごう)は「=」のかたちをした数学記号である。「イコール」と読むことが多い。等号の左右が等価であることを表し、等号で結ばれた数式を「等式」と呼ぶ。
引用:「等号」(2019年1月26 (土) 10:00 UTCの版)『ウィキペディア日本語版』。
Wikipediaで調べてみました。 =
の左辺と右辺が***"等価"***であるということを表すとのことです。
Kotlinにおける等価とは?
Kotlinでは、=
の記号は代入として扱われ、等価かどうか判断する記号は==
や===
が用いられます。
===
は、参照の等価性による判定
a === b
の場合、a
とb
が同じオブジェクトかどうかの判定になります。
1 === 1 // 同じオブジェクトなのでtrue
1 === 2 // 別のオブジェクトなのでfalse
Hoge() === Hoge() // それぞれのオブジェクトとして生成されるのでfalse
val hoge = Hoge()
hoge === hoge // 同じオブジェクトなのでtrue
==
は、equalsメソッドのシンタックスシュガー
1 == 1 // 1.equals(1)と同じ
==
の場合は、equals()の実装によって等価かどうか(trueかfalse)が変わってきます。
基本的なequals()の実装は、オブジェクト毎に違う整数値を返すhashCode()の比較で実装されているので===
と同じ動きをします。
equals()は、オーバーライドが可能なので等価の基準を各々で定義できます。
==
と===
の違いは?
調べてみた私の感想としては、オーバーライド出来るか出来ないかの違いが大きいのかと感じました。
必ず同じオブジェクトか判定したい場合は===
を、そのクラスを実装した人が等価だと思う基準で判定したい場合は==
を使えばいいのかなと思います。
ただし、==
があなたが思っている***"等価"***とは違う可能性があるのでequals()の実装をちゃんと理解して使いましょう。