很多程序设计语言都使用”==”来判断两个数据是否相等,我们在编程中也经常使用这个运算符,以至于对它已经熟视无睹。那么是不是任意两个数据都可以使用”==”来判断相等呢?”==”比较的到底是什么?我们今天就通过一篇短文来聊聊这个不起眼的”==”运算符。
一、基础数据类型之间的比较
首先我们来看一段代码
这段代码当中,声明了8个基础类型的变量,这8个变量当中,boolean型的flag是个“异类”,为什么这么说呢?因为其他7种数据类型之间都可以使用”==”做比较,无论比较的结果是true还是false,但至少能够顺利通过编译,不会出现语法错误。但boolean类型的变量只能与其类型相同的变量进行比较,否则就会出现语法错误,如下图:
通过上面的代码我们可以看到,不能把boolean类型的数据与其他7种基础数据进行比较,否则会报错。我们把这种现象戏称为“ 孤独的布尔 ”。那么,为什么boolean类型的数据不能与其他7种基础数据进行比较呢?原因很简单,就是因为其他7种类型的数据,本质上都是“数字”,我们使用”==”对这7种数据进行比较,比较的就是“数字的值”是否相等。而boolean类型的数据只有true和false两种逻辑值,不能用来与“数字”进行比较。
二、对象之间的比较
两个对象之间如果用“==”进行比较,会不会报错呢?很多人可能会说,我用“==”比较过两个String对象,其他情况似乎并不清楚。那么我们就来说说两个对象之间用”==”进行比较的规则。首先必须清楚,两个对象之间如果使用”==”进行比较,比的到底是什么?按照Java官方的说法,使用”==” 是比较“两个对象内存地址的数值是否相等”。我们可能不太理解这句话的意思,如果翻译成大白话就是说:看一下这两个对象是不是“同一个”对象。那么,是不是任意两个对象都能用”==”进行比较运算呢?如果这两个对象的类型是相同的,就可以用”==”进行运行运算,反之,如果这两个对象的类型不相同,使用”==”进行比较就会报错。我们可以看下面的代码
代码中,a1和a2类型相同,可以用”==”进行比较,但a1和b1类型不同,用”==”进行比较就会报错。我们把对象之间的比较规则,可以用一个词来概括,那就是“ **物以类聚** ”。意思是类型相同才能进行比较。
两个对象用”==”进行比较,还有一种特殊情况,那就是两个对象的类型之间如果有 继承关系 ,那么也是可以用”==”进行比较的。请看下面的代码
大家可以看到,对象f是Father类型的,而对象c是Child类型的。但是Child类是Father类的子类,它们之间有继承关系,所以对象f和c也是可以用”==”进行比较的。其实f和c从本质上讲,也都是Father类的,所以也符合”物以类聚”规则。
三、对象与基础数据之间比较
按照Java的语法,一个对象是不能直接用”==”和一个基础数据进行比较。但是,从JDK1.5开始,Java支持一种叫做”自动装箱拆箱”的机制,这个机制的引入,产生了一种特殊情况,那就是:基础数据类型可以和包装类对象直接进行比较。
在这里,首先说一下”包装类”是个什么东西。Java语言为了能够让基础数据在某些特殊场合下用对象的形式表示或处理基础数据类型,就为每种基础数据类型都定义了一个包装类。每个包装类的对象当中,就包含一个基础类型的数据。基础数据类型一共有8种,分别是:Btye、Short、Integer、Long、Double、Float、Character和Boolean,分别对应byte、short、int、long、double、float、char和boolean这8种基础数据类型。比如一个Integer类的对象当中,就包含了一个int类型的数据。
自动装箱拆箱机制,能够让我们直接在程序中,把包装类的对象和基础数据类型进行比较。请看下面的程序
通过这段程序,我们可以发现:
1、一个int类型的数据可以直接和Integer类型的对象用”==”进行比较(见标号为①的代码),因为自动拆箱装箱机制在起作用。
2、一个int类型的数据甚至可以直接和Double类型的对象直接用”==”进行比较(见标号为②的代码),因为有自动装箱拆箱机制做保证,并且它们 本质上都是数字 。只要是数字之间的比较都是合法的。
但是:
3、Boolen类型的对象还是不能和其他基础类型数据进行比较(见标号为③的代码),因为” 布尔是孤独的 ”。
4、两个包装类对象进行比较,如果这两个对象类型不同,也不能直接比较(见标号为④的代码),因为这两个对象 所属的类型并无继承关系 。
希望通过这篇短文能够帮助大家对”==”这个运算符会有更深入的认识。