Help us understand the problem. What is going on with this article?

Kotlinの==と===はどう違うの?

More than 1 year has passed since last update.

Kotlinには、オブジェクトを比較する場合に1 == 11 === 1の二種類があり、それぞれどう違うのかってのが話題に上がったので調べてみました。

(=)イコールとは?

等号(とうごう)は「=」のかたちをした数学記号である。「イコール」と読むことが多い。等号の左右が等価であることを表し、等号で結ばれた数式を「等式」と呼ぶ。

引用:「等号」(2019年1月26 (土) 10:00 UTCの版)『ウィキペディア日本語版』。

Wikipediaで調べてみました。 =の左辺と右辺が"等価"であるということを表すとのことです。

Kotlinにおける等価とは?

Kotlinでは、=の記号は代入として扱われ、等価かどうか判断する記号は=====が用いられます。

===は、参照の等価性による判定

a === bの場合、abが同じオブジェクトかどうかの判定になります。

    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()の実装をちゃんと理解して使いましょう。

参考にしたもの

44x1carbon
KotlinやDDDを勉強中です
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away