Scala中==,eq與equals的區(qū)別

根據(jù)官方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.

簡(jiǎn)言之,equals方法是檢查是否相等,而eq方法檢查的是引用是否相等。所以如果比較的對(duì)象是null那么==調(diào)用的是eq,不是null的情況調(diào)用的是equals。
看一個(gè)簡(jiǎn)單的例子:
在java中如果要對(duì)兩個(gè)對(duì)象進(jìn)行值比較,那么必須要實(shí)現(xiàn)equals 和hashCode方法。而在scala中為開(kāi)發(fā)者提供了case class,默認(rèn)實(shí)現(xiàn)了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

而對(duì)于Array或者M(jìn)ap對(duì)象不能簡(jiǎn)單點(diǎn)使用equals進(jìn)行比較,要通過(guò)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中存的是對(duì)象,也是一樣的,例如

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容