根据官方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. Django中模型(三)

    Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自 ...

  2. php filesize() 方法返回的文件大小异常

    问题描述:需要生成一个 700k 大小左右的文件,相关代码如下: <?php $handle = fopen('./split.log', 'a+'); $result = 0; while( ...

  3. GridView 子项长度和宽度一样

    下面是gridview 控件,每行放置四个,因此用宽度除4. 下面展现出来的的界面就显的比较美观. public class HotSearchAdapter extends BaseAdapter ...

  4. EF Core中外键关系的DeleteBehavior介绍(转自MSDN)

    Delete behaviors Delete behaviors are defined in the DeleteBehavior enumerator type and can be passe ...

  5. 获取并安装XWAF框架压缩包(2)

    建议在Eclipse环境下使用XWAF框架来开发用户的Web项目,并遵循以下步骤和约定. 1.获取XWAF框架压缩包文件 程序员点击下列地址免费下载XWAF框架的压缩包文件:XWAF框架压缩文件 2. ...

  6. javascript 使用 匿名 箭头函数 this的变化

    处理html 页面 <body> <div class="main"> <div class="up"> <div c ...

  7. C++练习 | 求解二叉树的高度

    int h(BTree *bt) { if(bt->lchild==NULL&&bt->rchild==NULL) ; if(bt->lchild!=NULL& ...

  8. py基础__socket编程

    目录 Python基础__socket编程 1.计算机网络 2.socke编程 3.socketserver模块 4.思考 Python基础__socket编程 1.计算机网络 1.OSI网络七层模型 ...

  9. TP5.0中多图上传文件名重复问题

    最近在做项目的时候出现了一个问题,这里记录一下: 问题: 使用TP5.0框架自带的文件上传方法后,发现多图上传可能会出现文件名重复的问题. 问题代码: 找到TP5框架上传文件命名方法,/thinkph ...

  10. JavaScript入门学习(0)相关 软件工具

    JavaScript本地脚本编辑工具(1st JavaScript Editor Pro ) 必要设置     https://pan.baidu.com/s/1XoaNA9o0qt2eJfLgoZ5 ...