在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培训