scala 对象的相等
1 equals方法
先看一个例子:
package cn.com.tengen.test.obj
case class Person(firstName: String, lastName: String, age: Int)
object Person extends App{
val p1a = Person("Dean", "Wampler", 29)
val p1b = Person("Dean", "Wampler", 29)
val p2 = Person("Buck", "Trends", 30)
println(p1a equals p1b) // 输出: true
println(p1b equals p1a)// 输出: true
println(p1a equals p2)// 输出: false
println(p1a equals null)// 输出: false
// println(null equals p1a)// 抛出 java.lang.NullPointerException异常
// println(null equals p1b)// 抛出 java.lang.NullPointerException异常
val l1 = Nil
val l2 = List(p1a)
val l3 = List(p1b)
val l4 = List(p2)
println(l1 equals l2)// 输出: false
println(l3 equals l2)// 输出: true
println(l3 equals l4)// 输出: false
}
scala中的equals 的行为类似Java 里的equals
2 ==和!=方法
package cn.com.tengen.test.obj
case class Person(firstName: String, lastName: String, age: Int)
object Person extends App{
val p1a = Person("Dean", "Wampler", 29)
val p1b = Person("Dean", "Wampler", 29)
val p2 = Person("Buck", "Trends", 30)
println(p1a == p1b) // 输出: true
println(p1b != p1a)// 输出: false
println(p1a == p2)// 输出: false
println(p1a == null)// 输出: false
println(null == p1a)// 输出: false
println(null != p1b)// 输出: true
println(null == null)// 输出: true
val l1 = Nil
val l2 = List(p1a)
val l3 = List(p1b)
val l4 = List(p2)
println(l1 == l2)// 输出: false
println(l3 == l2)// 输出: true
println(l3 == l4)// 输出: false
}
在第一个参数不为null的时候,==和equals的结果是一样的,这一点和Java的不同
3 eq和ne方法
eq 方法用于测试引用的相等性。也就是说,如果obj1 和obj2 指向内存中的同一个位置,obj1 eq obj2 就为true。这两个方法只对AnyRef 类型有定义:
package cn.com.tengen.test.obj
case class Person(firstName: String, lastName: String, age: Int)
object Person extends App{
val p1a = Person("Dean", "Wampler", 29)
val p1b = Person("Dean", "Wampler", 29)
val p2 = Person("Buck", "Trends", 30)
val p3 = p2
println(p1a eq p1b) // 输出: false
println(p1b eq p1a)// 输出: false
println(p1b eq p1a)// 输出: false
println(p3 eq p2)// 输出: true
println(p1a eq null)// 输出: false
println(null eq p1a)// 输出: false
println(null eq p1b)// 输出: false
println(null eq null)// 输出: true
val l1 = Nil
val l2 = List(p1a)
val l3 = List(p1b)
val l4 = List(p2)
println(l1 eq l2)// 输出: false
println(l3 eq l2)// 输出: false
println(l3 eq l4)// 输出: false
}
从这个例子中我们可以看出,eq和Java中==是比较像,但又有区别
对非AnyRef 类型调用eq,则会出错
val i1:Int = 1
val i2:Int = 1
val i3:Int = 3
println(i1 eq i2)
println(i1 eq i3)
package cn.com.tengen.test.obj
case class Person(firstName: String, lastName: String, age: Int)
object Person extends App{
val p1a = Person("Dean", "Wampler", 29)
val p1b = Person("Dean", "Wampler", 29)
val p2 = Person("Buck", "Trends", 30)
println(p1a ne p1b) // 输出: true
println(p1b ne p1a)// 输出: true
println(p1a ne p2)// 输出: true
println(p1a ne null)// 输出: true
println(null ne p1a)// 输出: true
println(null ne p1b)// 输出: true
println(null ne null)// 输出: false
val l1 = Nil
val l2 = List(p1a)
val l3 = List(p1b)
val l4 = List(p2)
println(l1 ne l2)// 输出: true
println(l3 ne l2)// 输出: true
println(l3 ne l4)// 输出: true
}
4 数组相等和sameElements方法
比较两个数组,在Scala 中并不能得出我们认为的显而易见的结果:
scala> Array(1, 2) == Array(1, 2)
res1: Boolean = false
有一个简单的解决方案,就是sameElements 方法:
scala> Array(1,2) sameElements Array(1,2)
res2: Boolean = true