根据官方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. 【问题】 cookie 不保存特殊字符 解决办法

    遇到的问题: 在做项目,用geolocation 获取经纬度,格式如(23.1133,113.2552) ,想保存到cookie中备用.但读取cookie出来之后发现逗号变成了  %2c. 找到的原因 ...

  2. Spring(一)之概括与架构

    个人说明: 下面有一部分引用该链接:https://www.tutorialspoint.com/spring/spring_architecture.htm 另外一部分加上我个人的使用经验和体会 之 ...

  3. centos 清除yum缓存

    No package nginx available. yum makecache yum install epel-release yum install nginx

  4. 解析oracle对select加锁的方法以及锁的查询 转

    转自 https://www.jb51.net/article/37587.htm 本篇文章是对oracle对select加锁的方法以及锁的查询进行了详细的分析介绍,需要的朋友参考下 解析oracle ...

  5. HTML和CSS基础知识

    html基本结构<html>内容</html> html开始标记<head>内容</head> html文件头标记<title>内容< ...

  6. 系统构架篇之基于SSDB的二级缓存

    1.什么是ssdb 你可以把ssdb理解成redis.不同之处在于redis缓存的数据是在内存中的,所能缓存的数据大小受内存大小的限制,一般不适合缓存大量的数据.而ssdb将数据保存在磁盘中,数据量大 ...

  7. ios 开发UI篇— UIToolbar

    前言 NS_CLASS_AVAILABLE_IOS(2_0) __TVOS_PROHIBITED @interface UIToolbar : UIView <UIBarPositioning& ...

  8. angular的生命周期

    什么是生命周期 生命周期函数通俗的讲就是组件创建.组件更新.组件销毁的时候会触发的一系列的方法. 当 Angular 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些 生命周期钩子 ...

  9. 今天在Qt子界面中的Button,转到槽转不过去,报错Qt The class containing 'Ui::MainWindow' could not be found in...

    在网上查了原因,因为我在修改button的名字时,没选中button,选中了子界面对话框Dialog,然后修改了名字,又没有改回去,所以button转到槽报错. 参考网站: https://zhida ...

  10. java学习无止境,工资价更高

    原 推荐10个Java方向最热门的开源项目(8月) 2018年08月28日 17:54:32 SnailClimb在CSDN 阅读数:849   版权声明:本文为博主原创文章,未经博主允许不得转载. ...