Scala中== eq equals区别

近日在改造代码的时候遇到了一个问题,经过排查后是因为Java和Scala对于判断对象是否相等有一些区别。

English version

一、Java

在Java中,判断对象是否相等一般来说有两个方法。

1、==

  • 基本数据类型:byte、short、int、long、float、double、boolean、char。 比较的是他们的
  • 引用数据类型:比较的是他们的引用,也就是内存中的地址。

2、equals

Object类中定义了equals方法, 源码如下。

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

默认比较的是对象的地址是否相同, 但是对于实际的业务逻辑来说,意义不大。绝大多数时候我们会重写equals方法来判断值是否相等。
因为很多时候如果两个对象的值相等,我们就认为他们相当。比如String就重写了equals方法。

3、常见用法

一般我们在判断一个字符串是否等于某特定字符串,写法如下:

1
if(str != null && str.equals("test"))

或者

1
if("test".equals(str))

避免str传入为null,导致空指针的问题。

二、Scala

在Scala中,判断是否相等有三个方法。首先看一下官方API定义:

  • 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.
  • final def ==(arg0: Any): Boolean
    The expression x == that is equivalent to if (x eq null) that eq null else x.equals(that).

1、eq

eq在Scala中判断的就是对象的引用是否相同,功能等于Java中的==。

2、equals

equals的功能不变,跟Java中equals相等,判断对象的值是否相等。

3、==

官方API写到,表达式x==that,首先判断x是否为null,如果不为null则返回x.equals(that)。
其实相等于Java代码中首先判断对象是否为null,然后调用equals方法判断值是否相等,避免了空指针的问题。

三、总结

Java中的== 跟 Scala中的eq相等。
Java中的equals 跟 Scala中的equals相等。
Scala中的==是 先判null然后再判断值是否相等,避免了空指针的问题,感觉像是升级版的判断相等的方法。


# Scala

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×