Java千問:你真的掌握了Java語言的"=="運算符嗎?我看未必!

很多程序設計語言都使用”==”來判斷兩個數據是否相等,我們在編程中也經常使用這個運算符,以至於對它已經熟視無睹。那麼是不是任意兩個數據都可以使用”==”來判斷相等呢?”==”比較的到底是什麼?我們今天就通過一篇短文來聊聊這個不起眼的”==”運算符。

一、基礎數據類型之間的比較

首先我們來看一段代碼

這段代碼當中,聲明瞭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、兩個包裝類對象進行比較,如果這兩個對象類型不同,也不能直接比較(見標號爲④的代碼),因爲這兩個對象所屬的類型並無繼承關係

         希望通過這篇短文能夠幫助大家對”==”這個運算符會有更深入的認識。

如想系統學習Java編程,可以點擊這裏觀看我的視頻課程,有問題也可以加入我的QQ羣291839907一起討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章