在 Java 和 Scala 语言中,== 和 equals 的用法是略有不同的,如果不比照学习,容易产生困惑,当初来比照总结。
一、Java 当中的数据类型和“==”的含意:
根本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比拟,利用双等号(==), 比拟的是他们的值。
援用数据类型:当他们用(==)进行比拟的时候,比拟的是他们在内存中的寄存地址(确切的说,是堆内存地址)。
注:对于第二种类型,除非是同一个 new 进去的对象,他们的比拟后的后果为 true,否则比拟后后果为 false。因为每 new 一次,都会从新开拓堆内存空间。
二、Java 中 equals() 办法介绍:
JAVA 当中所有的类都是继承于 Object 这个超类的,在 Object 类中定义了一个 equals 的办法,equals 的源码是这样写的:
public boolean equals(Object obj) {
//this – s1
//obj – s2
return (this == obj);
}
能够看到,这个办法的初始默认行为是比拟对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个办法被重写了,如 String、Integer、Date。在这些类当中 equals 有其本身的实现(个别都是用来比拟对象的成员变量值是否雷同),而不再是比拟类在堆内存中的寄存地址了。
所以说,对于复合数据类型之间进行 equals 比拟,在没有覆写 equals 办法的状况下,他们之间的比拟还是内存中的寄存地位的地址值,跟双等号(==)的后果雷同;如果被复写,依照复写的要求来。
咱们对下面的两段内容做个总结吧:
== 的作用:
根本类型:比拟的就是值是否雷同
援用类型:比拟的就是地址值是否雷同
equals 的作用:
援用类型:默认状况下,比拟的是地址值。
注:不过,咱们能够依据状况本人重写该办法。个别重写都是主动生成,比拟对象的成员变量值是否雷同
在 Scala 中对于 == 和 equals 办法的应用有所不同,== 的实现很用心,当调用 == 操作符时,会首先查看左侧是否为 null,若不为 null,则调用 equals 办法,而调用的 equals 办法的具体比拟逻辑,则取决于左侧参数的类型,对于根底数据类型以及 String 类型来说,equals 办法的逻辑次要为比拟两者的值是否相等。所以在 Scala 中,当你调用 == 或者 equals 办法时,更多的失去是二者的值是否相等(除非你比拟的对象类型重写了 equals 办法,实现了本人的比拟逻辑),而且很显著应用 == 比 equals 更平安,因为 == 会首先确认左侧对象是否为 null,防止了空指针异样。如果你想比拟两个对象的援用是否相等,Scala 为用户提供了 eq 办法。总结如下:
==、equals 的作用:
比拟值相等性,== 会首先判断左侧对象是否为 null,而后调用对象类型的 equals 办法,更平安。
Eq 办法的作用:
比拟援用相等性。
关键词:java 培训