開発者ドキュメント

Kotlinの“ ==”と“ ===”演算子の違い


1概要

この記事では、Kotlin ** の「==」と「===」演算子の違いについて説明します。

Kotlinには、Javaと同じように、同等の概念が2つあります。つまり、参照同等性

と構造同等性

です。


2参照等価

参照等価性のために、オブジェクトの参照を評価することを可能にする

===

記号を使用します(同じオブジェクトを指している場合)。これは、Javaの“ ==”演算子と同じです。

2つの整数が定義されているとしましょう。

val a = Integer(10)
val b = Integer(10)

そして、両方とも

a === b

を実行してそれらをチェックします。これは、それぞれがメモリ内の異なる場所を指す2つの別々のオブジェクトであるため、

false

を返します。


3構造的同等性

構造的に等しいために、両方の値が同じ(または等しい)かどうかを評価する

==

記号を使用します。これは通常、Javaで

equals()

メソッドを実装することによって実現されます。

したがって、同じ

Integers

の例を使用して、

a == b

を実行するだけで済みます。この場合、両方の変数が同じ値を持つため、

true

が返されます。


4複雑なオブジェクトの比較

より複雑なオブジェクトの等価性をチェックしたい場合、シンボルは同じように動作します。趣味のリストがある

User

があるとしましょう。

data class User(val name: String, val age: Int, val hobbies: List<String>)


===

は参照の等価性をチェックし、

List <>

を便利に使用することで、オブジェクト

とリスト

に含まれるデータをチェックする

==

演算子を利用できます。


5等式の配列


Arraysの場合、Kotlin 1.1以降では、

infix

関数https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/content-equals.html[

contentEquals

]およびhttpsを使用して、構造的な等価性を確認できます。//kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/content-deep-equals.html[

contentDeepEquals__]:

val hobbies = arrayOf("Hiking, Chess")
val hobbies2 = arrayOf("Hiking, Chess")

assertTrue(hobbies contentEquals hobbies2)


6. 結論

この簡単なチュートリアルでは、非常に単純な例を通して、Kotlin ** における参照と構造の等価性の違いを紹介しました。

いつものように、これらすべての例とスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubで動く]にあります。

これはMavenベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。

モバイルバージョンを終了