scala 对象的相等

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

猜你喜欢

转载自blog.csdn.net/u014646662/article/details/84139552
今日推荐