近日在改造代码的时候遇到了一个问题,经过排查后是因为Java和Scala对于判断对象是否相等有一些区别。
一、Java
在Java中,判断对象是否相等一般来说有两个方法。
1、==
- 基本数据类型:byte、short、int、long、float、double、boolean、char。 比较的是他们的值。
- 引用数据类型:比较的是他们的引用,也就是内存中的地址。
2、equals
Object类中定义了equals方法, 源码如下。
1 | public boolean equals(Object 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然后再判断值是否相等,避免了空指针的问题,感觉像是升级版的判断相等的方法。