Scala中=,eqとequalsの違い
2710 ワード
公式APIの定義によると: final def ==(arg0: Any): Boolean The expression x == that is equivalent to if (x eq null) that eq null else x.equals(that). final def eq(arg0: AnyRef): Boolean Tests whether the argument (that) is a reference to the receiver object (this). def equals(arg0: Any): Boolean The equality method for reference types.
簡単に言えば、equalsメソッドは値が等しいかどうかを検査し、eqメソッドは参照が等しいかどうかを検査する.したがって,比較オブジェクトがnullである場合==eqが呼び出され,nullでない場合equalsが呼び出される.簡単な例を見てみましょう.javaで2つのオブジェクトを値比較する場合は、equalsメソッドとhashCodeメソッドを実装する必要があります.scalaでは開発者にcase classが提供され,デフォルトではequalsとhashCode法が実現されている.
一方、ArrayまたはMapオブジェクトについては、equalsを使用して単純に値を比較することはできません.たとえば、
Arrayにオブジェクトが存在する場合も、たとえば
簡単に言えば、equalsメソッドは値が等しいかどうかを検査し、eqメソッドは参照が等しいかどうかを検査する.したがって,比較オブジェクトがnullである場合==eqが呼び出され,nullでない場合equalsが呼び出される.簡単な例を見てみましょう.javaで2つのオブジェクトを値比較する場合は、equalsメソッドとhashCodeメソッドを実装する必要があります.scalaでは開発者にcase classが提供され,デフォルトではequalsとhashCode法が実現されている.
scala> case class Bread(brand:String, price:Int)
defined class Bread
scala> val b1 = Bread("BreadTalk", 50)
b1: Bread = Bread(BreadTalk,50)
scala> val b2 = Bread("BreadTalk", 60)
b2: Bread = Bread(BreadTalk,60)
scala> b1 eq b2
res2: Boolean = false
scala> b1 equals b2
res3: Boolean = true
一方、ArrayまたはMapオブジェクトについては、equalsを使用して単純に値を比較することはできません.たとえば、
sameElements
の方法で、次のようにします.scala> val a1 = Array("x", "y")
a1: Array[String] = Array(x, y)
scala> val a2 = Array("x", "y")
a2: Array[String] = Array(x, y)
scala> a1 equals a2
res4: Boolean = false
scala> a1 eq a2
res5: Boolean = false
scala> a1 sameElements a2
res6: Boolean = true
scala> val m1 = Map(1->"x", 2->"y")
m1: scala.collection.immutable.Map[Int,String] = Map(1 -> x, 2 -> y)
scala> val m2 = Map(1->"x", 2->"y")
m2: scala.collection.immutable.Map[Int,String] = Map(1 -> x, 2 -> y)
scala> m1 sameElements m2
res7: Boolean = true
scala> val m3 = Map(1->"x", 2->"z")
m3: scala.collection.immutable.Map[Int,String] = Map(1 -> x, 2 -> z)
scala> m1 sameElements m3
res8: Boolean = false
Arrayにオブジェクトが存在する場合も、たとえば
scala> case class Bread(brand:String, price:Int)
defined class Bread
scala> val b1 = Bread("BreadTalk", 50)
b1: Bread = Bread(BreadTalk,50)
scala> val b2 = Bread("BreadTalk", 50)
b2: Bread = Bread(BreadTalk,50)
scala> val b3 = Bread("BreadTalk", 60)
b3: Bread = Bread(BreadTalk,60)
scala> val a1 = Array(b1)
a1: Array[Bread] = Array(Bread(BreadTalk,50))
scala> val a2 = Array(b2)
a2: Array[Bread] = Array(Bread(BreadTalk,50))
scala> val a3 = Array(b3)
a3: Array[Bread] = Array(Bread(BreadTalk,60))
scala> a1 equals a2
res0: Boolean = false
scala> a1 sameElements a2
res1: Boolean = true
scala> a1 equals a3
res2: Boolean = false
scala> a1 sameElements a3
res3: Boolean = false