Scala的对象相等性判断

  在介绍如何判断Scala 对象是否相等之前,先来了解一下Java中判断两个对象是否相等的方式。Java中的类型分为两大类,一种是基本类型,主要存储的是数值,使用的方判断两个值是否相等,另一种是引用类型,在引用类型中有两种比较方式,第一种方式是使用==比较引用的是否是同一个对象,第二种方式是使用自定义的equals方法比较两个对象的引用是否相等。 
  在Scala中有三种方法判断对象的相等性,这三种方法主要分为两大类,第一种和第二种为一类,第三种方法为另外一类。在大多数情况下(非空),equal方法和比较的内容是相同的。 三种判断方法如下: 
(1) equal方法:相当于Java中的 equals方法。

(2)==与!=:相当于Java中的equals方法。

(3) eq与ne:相当于Java中的引用(使用==判断引用)。

下面举一个例子,判断对象是否相等。 
(1) val p1=new Person2("java",10)。

(2) val p2=new Person2("scala",10)。

(3) val p3=new Person2("java",30)。

(4) val p4=new Person2("java",10)。

(5) val a1=Array(1,2)。

(6) val a2=Array(1,2)。

(7) val 11=List(1,2)。

(8) val 12=List(1,2)。
创建RunEqual.scala文件,相关代码如下:

package scala
object RunEqual {
  def main (args: Array[String]): Unit = {
    //1.String 
    val s1=new String ("scala")
    val s2=new String ("scala")
    val s3=new String ("java")
    println(s"s1 == s2 ? ${s1==s2}") 
    println(s"s1 == s3 ? ${s1==s3}") 
    println(s"sl equals s2 ? ${sl equals s2}")
    println(s"s1 equals s3 ? ${sl equals s3}")
    println(s"sl eq s2 ? ${sl eq s2}")
    println(s"sl eq s3 ? ${sl eq s3}")
    //LIST
    val 11=List(1,2)
    val 12=List(1,2)
    println(s"11==12 ? ${11==12}")
    println(s"11 equals 12 ? ${1l equals 12}")
    printın(s"sl eq s2 ? ${11 eq 12}")
    //class be defined by uesr
    val sk1=new Socket("127.0.0.1",22)
    val sk2=new Socket("127.0.0.1",22)
    val sk3=new Socket("127.0.0.1",23)
    val sk4=new Socket ("127.0.2.1",28)
    println(s"skl == sk2 ? ${sk1==sk2}")
    println(s"skl == sk3 ? ${sk1==sk3}")
    println(s"skl == sk4 ? ${skl==sk4}")
    println(s"skl equals sk2 ? ${sk1 equals sk2}")
    println(s"skl equals sk3 ? ${sk1 equals sk3}")
    println(s"skl eq sk2 ? ${skl eq sk2}") 
    println(s"skl eq sk3 ? ${skl eq sk3}")
  }
}
class Socket(ip:String,port:Int) {
 override def equals(obj:Any): Boolean = {
    true
  }
}

  第8行代码使用==的方式判断对象s1和对象s2是否相等,结果返回true。第9行代码判断对象s1和对象s3是否相等,结果返回sfalse。第10行代码使用equals的方式判断对象s1和对象s2 是否相等,结果返回true。第12行代码使用eq的方式判断对象s1 和s2是否相等,由于eq 比较的是引用,而s1和s2不是同一个引用, 所以结果返回false。

  第15行和第16行代码分别定义了两个集合11和12。第17行代码使用==的方式判断集合11和12是否相等,结果返回true。 第18行代码使用equals的方式判断集合11和12是否相等,结果返回true。因为==和equals判断的是集合的内容,所以这两种方式返回的结果相同。第19行代码使用eq的方式判断集合11和12 是否相等,由于这两个集合的引用不相等,所以结果返回false。

  第34行代码定义了一个Socket类和两个类参数ip和port,在类中重写了equals方法,结果返true。第25行代码使用==的方式判断sk1和sk2是否相等,结果返回true。第29行代码使用equals的方式判断sk1和sk2是否相等,结果返回true。第30行代码使用eq的方式判断sk1和sk2是否相等,结果返回false。对象相等的这种行为实际上是由重写的方法决定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值