根据官方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的区别的更多相关文章
-
Scala学习笔记(三):==,eq与equals的区别
== Scala中==与java中不同,它是比较值是否相等的,无论比较对象是否是相同类型 List(1, 2, 3) == List(1, 2, 3) //true 1==1.0//true equa ...
-
java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
-
Scala 中object和class的区别
Scala中没有静态类型,但是有有“伴侣对象”,起到类似的作用. Scala中类对象中不可有静态变量和静态方法,但是提供了“伴侣对象”的功能:在和类的同一个文件中定义同名的Object对象:(须在同一 ...
-
Scala中 object 和 class的区别
object 在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString.对象的构造器在第一 ...
-
Scala中 =>; Unit 与 () =>;Unit的区别
() => Unit ---> 是一个函数:=> Unit --> 是一个执行结果为Unit的表达式 code: => Unit是 by name 传递参数.参数是一个返 ...
-
java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
-
C#中的==和Equals的区别
一,值类型中的比较,对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false. ; ; bool bi1 = ai.Equals(bi); //true bool b ...
-
Scala中class和object的区别
1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C ...
-
java中等于和equals的区别
面试的时候没答上,很受打击,特写在这里. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 除了String和封装器,equals()和“ ...
随机推荐
-
搭建自己的PHP框架心得(三)
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
-
超链接a标签
a: ---页面中锚点的链接: <a href="#point"></a> <p id="#point">锚链接</ ...
-
Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary
此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa ...
-
journal
dec 5 rpt prep exam dec 4 lie to me dec 3 exam dec 2 preparation for exam dec 1 preparation for exam ...
-
为什么SSL证书流量暴增?
网络服务提供商 Sandvine 近日发布了一份报告,中提到了一个非常有趣的现象:和去年的数据相比,加密网络流量(SSL)在今年正在呈现出爆发式增长. 这个变化在欧洲表现得十分明显:和去年的 1.47 ...
-
C#模仿360安全卫士玻璃按钮,不闪烁,背景切换效率快
首先先上效果图: 1.准备两张透明的png图片(尺寸74 x 82),一张用于鼠标进入控件时显示,一张用于鼠标单击控件时显示 2.拖一个GlassButton按钮 3.设置按钮属性 this.btnE ...
-
java(jdk1.7) IO系列01之InputStream和OutputStream解析
1.InputStream和OutputStream简介 在java中InputStream和OutputStream分别代表字节输入流和字节输出流,表示以字节的方式来实现进程或者程序的通信,Inpu ...
-
ThinkPHP5 远程代码执行漏洞被入侵日志,升级最新版本解决
2018年12月9日,ThinkPHP团队发布了一个补丁更新,修复了一处由于路由解析缺陷导致的代码执行漏洞.该漏洞危害程度非常高,默认环境配置即可导致远程代码执行.经过启明星辰ADLab安全研究员对T ...
-
Golang入门教程(九)复合数据类型使用案例二
参考:http://www.runoob.com/go/go-slice.html 目录 切片 字典(map) 函数(func) 接口(interface) 通道(chan) 四.切片(Slice) ...
-
android IO流操作文件(存储和读取)
存储文件: public class FileOperate extends Activity { private static final String FILENAME = "mydat ...