2025-03-01 03:16:37
在许多语言中,使用 == 来判断两个值是否相等。有些语言中还有 is ,但是意义各不相同,本文着重于介绍各语言中这些概念。
Python 中的 == 来比较两个值是否相等。例如:
数值上的相等是显而易见的,那么对于对象呢?
先以 Python 自带的 list 对象为例:
Python 将会对 list 中的每个元素进行比较。对于类的实例,实际上是调用 __eq__() 方法来进行比较的。
Python 中的 is 则表示是否是同一对象:
对于简单的数字:
但是对于对象:
Python 中还有 isinstance() 函数和 type() 函数,用以确定对象的类别。
区别:
如果要判断两个类型是否相同推荐使用 isinstance()。
下面引用菜鸟教程的例子:
在上文的 Python 中, == 用来判断值是否相等, is 用来判断是否是同一个对象。而在 Java 中, == 同时拥有以上两种含义。
== 对于基本数据类型,是比较值;对于引用数据类型,是比较是否是同一对象,或者说是比较 堆内存地址 。
对于基本类型,自然可以直接 == 。(但是 Java 是区分 int 和 Integer,double 和 Double 等的,要注意!)
对于类的实例,则比较的是否是同一对象。
默认情况下,比较是否是同一对象,将上例中的 instanceA == instanceB 改为 instanceA.equals(instanceB) ,仍然输出 false 。
因此,我们需要重写(Override) equals() 方法,来实现自定义的比较:
不过上文这种重写并不优雅,工程中请勿这样使用。
Java 中使用 instanceof 来比较一个对象是否是一个类的实例。
DemoClass 类定义如前文,不赘述。
我们把 instanceA 的静态类型从 DemoClass 改为 Object ,众所周知, DemoClass 继承于 Object 。
但是这样输出的仍然是 true 。
首先是对于简单的数字,这种情况下,各语言的 == 都会是比较值的。
Kotlin 的双等于号相当于 Java 的 equals ,这在比较两个字符串是否内容相同时很方便。
在没有重写 equals 方法的情况:
似乎是 Kotlin 会自动生成一个 euqals 方法,所以这里的 instanceA == instanceB 为 true 。
重写了之后,就更加明了了。
Kotlin 中有三等号 === 来判断是否是同一对象。
这里可以看出, instanceA == instanceB 为 false ,因为二者并非同一对象。
Kotlin 中的 is 类似于 Python 中的 isinstance 、Java 中的 instanceof :