Scala中==,eq与equals的区别
根据官方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()和“ ...
随机推荐
- 链表推导式 【list comprehension】
x for x in x 链表推导式 [list comprehension]链表推导式提供了一个创建链表的简单途径,无需使用 map(), filter() 以及 lambda.返回链表的定义通常要 ...
- 查看apache当前并发访问数和进程数
1.查看apache当前并发访问数: netstat -an | grep ESTABLISHED | wc -l 对比httpd.conf中MaxClients的数字差距多少. 2.查看有多少个进程 ...
- eclipse中svn插件装好后出现"位置错误"的处理
错误现象: 验证位置时发生错误:"org.apache.subversion.javahl.ClientException:svn:E210004: Number is larger tha ...
- Read a large file with python
python读取大文件 较pythonic的方法,使用with结构 文件可以自动关闭 异常可以在with块内处理 with open(filename, 'rb') as f: for line in ...
- Linux用户和权限管理
用户:资源获取标识符,资源分配,安全权限模型的核心要素之一 密码:来实现用户认证 创建用户:useradd Username 生成的属性信息 /etc/passwd 用户名:密码:占位符:UID:GU ...
- React学习(一)
一. 允许HTML和JavaScript代码混写,使用JSX语法:遇到HTML标签就用HTML规则解析,遇到{}的代码块就用js解析 var names = ['Alice', 'Emily', 'K ...
- mongo数据集合属性中存在点号(.)
基本知识点: 1.似乎mongo3.6之前不允许插入带点(.)或美元符号($)的键,但是当我使用mongoimport工具导入包含点的JSON文件时,它工作正常. 2.在使用spring-data-m ...
- micro:bit 软件生态系统介绍
microbit 软件分成在microbit (Target Computer 如下图右边)上执行的及主计算机(Host Computer 如下图左边)上两类 : 一般程序写好后透过USB 转到mic ...
- Composer管理thinkphp版本
安装Composer 下载 Composer 安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号. 打开命令行并依次执行下列命令安装最新版本的 Comp ...
- 对SSL一个疑问的新理解
看了很多关于Https/SSL的介绍,关于数字证书部分,我一直有个疑问:如果数字证书文件被别人拿到,那是不是就可以进行通讯了呢?如果这样,那整个安全机制就完全失去作用了.从开发的角度,我拿到别人的数字 ...