Kotlin中equals方法与==,===

先看一段代码:

1 fun main(args: Array<String>) {
2     val person1 = Person(1,"liuliqianxiao")
3     val person2 = Person(1,"liuliqianxiao")
4     println(person1 == person2)//false
5 }
6
7 class Person(var id: Int, var name: String) {
8
9 }

自定义了一个类之后,天然的就能使用==运算符。这是因为Kotlin中==运算符会调用到equals函数,而equals是根类Any上定义的方法(这里我没找到Any上equals方法的实现)。

这里很容跟其他运算符重载的特性,导致一个惯性思维就是a == b就是调用的 a.equals(b),其实不然,a == b其实是如下调用过程:

默认实现的equals也许不是我们想要的而结果,此时可以自行重写equals方法。试着给Person类实现它自己的equals,偷个懒,直接idea快捷键生成吧:

 1 class Person(var id: Int, var name: String) {
 2     override fun equals(other: Any?): Boolean {
 3         if (this === other) return true
 4         if (other?.javaClass != javaClass) return false
 5
 6         other as Person
 7
 8         if (id != other.id) return false
 9         if (name != other.name) return false
10
11         return true
12     }
13
14     override fun hashCode(): Int {
15         var result = id
16         result = 31 * result + name.hashCode()
17         return result
18     }
19 }

此处ide自动生成的equals略显啰嗦,可以稍微简化下,如下代码:

1     override fun equals(other: Any?): Boolean {
2         if (this === other) return true
3         if (other !is Person) return false
4
5         return this.id == other.id && this.name == other.name
6     }

这里看到运算符重载,我们并没有加上operator关键字,这也是因为equals是在根类Any上定义的,已经加上了operator修饰符,如下:

public open operator fun equals(other: Any?): Boolean

所以子类只需要override就可以。

还有一点需要注意的是equals不能以扩展函数的形式实现。这是因为从Any继承来的equals方法优先级高于扩展函数。

在Kotlin中 ===运算符就相当于java中的==,比较的是两个引用是否相等。

!=运算符其实也是调用了equals

时间: 2024-08-26 09:44:48

Kotlin中equals方法与==,===的相关文章

JAVA中equals方法与hashCode方法学习

首先参考文章:http://www.oschina.net/translate/working-with-hashcode-and-equals-methods-in-java 1,equals方法的比较与 == 的区别是什么?为什么需要重写equals方法? 2,为什么说重写了equals方法最好重写hashCode方法?该问题在参考博文里面有一个实例解释了原因. 3,如何重写equals方法和hashCode方法? ——————————————————————————————————————

如何重写Java中的equals方法

Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型,不论是对象数组,列表等都扩展了Object类.了解学习Object中方法的设计原理和实现方式有助于更好的学习理解java语言.下面,我们首先学习一下Object中的equals方法. 判断两个对象相等时,JVM首先查找两个对象的hashCode, 如果两者hashCode不同,则返回false;如果

Java中==和equals方法的分析

原文引用https://www.dazhuanlan.com/2019/08/26/5d62fa816b34b/ 前言 == 和 equals是经久不衰的面试题,记得刚毕业的时候我也被问到过很多次,从最开始的一脸懵逼到最后的从容回答,本文我们就来分析下这两者之间的区别和联系. 为避免阅读疲劳,我这里先放上结论: 联系: 两者都被用来进行比较操作 当equals()未被重写时,两者的用途和比较的内容相同,即都是比较对象的引用地址是否相同 区别: ==既可以比较基本数据类型,亦可用在对象之间.equ

Java基础-equals方法

Object类中的equals方是用来判断一个对象等于另一个对象,至于这个等于的条件需要,比如说,String类的equals相等的条件就是字符串的内容必须相同,equals方法返回的值才为true.所以在我们在自己定义的类中,equals的重写是常见的!这里主要展示equals的特性和equals的正确写法,至于equals方法具体的含义这里不介绍! 1. 举一个例子 在这介绍其他的,我们先来看看正确的写法 public class Animal { private String name =

java中equals,hashcode和==的区别

1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.引用类型(类.接口.数组) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. 对象是放在堆中的,栈中存放的是对象的引用(地址).由此可见'=='是对栈中

第八周:hashCode()方法 &amp; equals()方法

在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,要是自己设计其中一个,就要设计另外一个.在多数情况 下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了.但是在一些情况下,这两个函数最好是自己设计,才能确保整个程序的正常运行.最常见的是当 一个对象被加入收集对象(collection object)时,这两个函数必须自己设计.更细化的定义是:如果你想将一个对象A放入另一个收集对象B里,或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙,并支持是

hashcode()和equals()方法

equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合

Java的equals方法实现及其细节

判断两个对象是否等价,是OOP编程中常见的需求(下面围绕Java来进行阐述). 考虑这样几种情况:通过某个特征值来判断两个对象是否"等价",当这两个对象等价时,判断结果为true,否则结果为false. 当然,这里的"特征值"不会只是简单的"对象引用",事实上,Object类(Java的"对象世界"的根)中实现的equals方法,就是把"特征值"设定为"对象引用"来进行判断等价性的,因此

Java Object类的equals()方法

所有类都从Object类中继承了equals方法,Object类中equals方法源代码如下: public boolean equals(Object obj)     {         return this == obj;     } Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,如果th