根據官方API的定義:java
簡言之,equals方法是檢查值是否相等,而eq方法檢查的是引用是否相等。因此若是比較的對象是null那麼==調用的是eq,不是null的狀況調用的是equals。
看一個簡單的例子:
在java中若是要對兩個對象進行值比較,那麼必需要實現equals 和hashCode方法。而在scala中爲開發者提供了case class,默認實現了equals 和hashCode方法。es6
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
方法,例如:express
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中存的是對象,也是同樣的,例如api
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
更多更好的文章請關注數客聯盟ui