Scala中==,eq与equals的区别

时间:2023-02-24 17:10:25

根据官方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.

简言之,equals方法是检查是否相等,而eq方法检查的是引用是否相等。所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。

看一个简单的例子:

在java中如果要对两个对象进行值比较,那么必须要实现equals 和hashCode方法。而在scala中为开发者提供了case class,默认实现了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

而对于Array或者Map对象不能简单点使用equals进行比较,要通过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中存的是对象,也是一样的,例如

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

更多更好的文章请关注数客联盟

Scala中==,eq与equals的区别的更多相关文章

  1. Scala学习笔记(三):==,eq与equals的区别

    == Scala中==与java中不同,它是比较值是否相等的,无论比较对象是否是相同类型 List(1, 2, 3) == List(1, 2, 3) //true 1==1.0//true equa ...

  2. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  3. Scala 中object和class的区别

    Scala中没有静态类型,但是有有“伴侣对象”,起到类似的作用. Scala中类对象中不可有静态变量和静态方法,但是提供了“伴侣对象”的功能:在和类的同一个文件中定义同名的Object对象:(须在同一 ...

  4. Scala中 object 和 class的区别

    object 在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString.对象的构造器在第一 ...

  5. Scala中 => Unit 与 () =>Unit的区别

    () => Unit ---> 是一个函数:=> Unit --> 是一个执行结果为Unit的表达式 code: => Unit是 by name 传递参数.参数是一个返 ...

  6. java中hashcode和equals的区别和联系

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  7. C#中的==和Equals的区别

    一,值类型中的比较,对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false. ; ; bool bi1 = ai.Equals(bi); //true bool b ...

  8. Scala中class和object的区别

    1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C ...

  9. java中等于和equals的区别

    面试的时候没答上,很受打击,特写在这里. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 除了String和封装器,equals()和“ ...

随机推荐

  1. 搭建自己的PHP框架心得(三)

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  2. 超链接a标签

    a: ---页面中锚点的链接: <a  href="#point"></a> <p id="#point">锚链接</ ...

  3. Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org&period;openqa&period;selenium&period;WebDriverException&colon; Failed to connect to binary FirefoxBinary

    此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa ...

  4. journal

    dec 5 rpt prep exam dec 4 lie to me dec 3 exam dec 2 preparation for exam dec 1 preparation for exam ...

  5. 为什么SSL证书流量暴增?

    网络服务提供商 Sandvine 近日发布了一份报告,中提到了一个非常有趣的现象:和去年的数据相比,加密网络流量(SSL)在今年正在呈现出爆发式增长. 这个变化在欧洲表现得十分明显:和去年的 1.47 ...

  6. C&num;模仿360安全卫士玻璃按钮,不闪烁,背景切换效率快

    首先先上效果图: 1.准备两张透明的png图片(尺寸74 x 82),一张用于鼠标进入控件时显示,一张用于鼠标单击控件时显示 2.拖一个GlassButton按钮 3.设置按钮属性 this.btnE ...

  7. java&lpar;jdk1&period;7&rpar; IO系列01之InputStream和OutputStream解析

    1.InputStream和OutputStream简介 在java中InputStream和OutputStream分别代表字节输入流和字节输出流,表示以字节的方式来实现进程或者程序的通信,Inpu ...

  8. ThinkPHP5 远程代码执行漏洞被入侵日志,升级最新版本解决

    2018年12月9日,ThinkPHP团队发布了一个补丁更新,修复了一处由于路由解析缺陷导致的代码执行漏洞.该漏洞危害程度非常高,默认环境配置即可导致远程代码执行.经过启明星辰ADLab安全研究员对T ...

  9. Golang入门教程(九)复合数据类型使用案例二

    参考:http://www.runoob.com/go/go-slice.html 目录 切片 字典(map) 函数(func) 接口(interface) 通道(chan) 四.切片(Slice) ...

  10. android IO流操作文件(存储和读取)

    存储文件: public class FileOperate extends Activity { private static final String FILENAME = "mydat ...