新聞中心
在復(fù)習(xí)以前學(xué)習(xí)內(nèi)容,發(fā)現(xiàn)equal和 ==是我以前學(xué)習(xí)的盲點(diǎn),所以查找資料,發(fā)現(xiàn)這個(gè)資料解釋的確實(shí)不錯(cuò),發(fā)出來(lái)供大家參考.
總結(jié):

網(wǎng)站制作、建網(wǎng)站找專業(yè)網(wǎng)絡(luò)公司成都創(chuàng)新互聯(lián):定制網(wǎng)站、模板網(wǎng)站、仿站、重慶小程序開發(fā)、軟件開發(fā)、成都APP應(yīng)用開發(fā)等。做網(wǎng)站價(jià)格咨詢成都創(chuàng)新互聯(lián):服務(wù)完善、十年建站、值得信賴!網(wǎng)站制作電話:028-86922220
- ==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間
- equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同
實(shí)例:
- public static void main(String[] args) {
- Integer num1=new Integer(23);
- Integer num2=new Integer(23);
- if(num1==num2){
- System.out.println("地址相等");
- }else if(num1.equals(num2)){
- System.out.println("值相等");
- }
- }
輸出為:值相等
eqauls 與 = =之異同
1)比較方式角度:
= =是面向過(guò)程的操作符;equals是面向?qū)ο蟮牟僮鞣?/p>
= =不屬于任何類,equals則是任何類(在Java中)的一個(gè)方法;
我們可以:
(1)Primitive1 (基本類型)= = Primitive2(基本類型);
(2)Object Reference1(對(duì)象引用)= = Object Reference2(對(duì)象引用)
(3)Object Reference1 (對(duì)象引用) .equals(Object Reference2 (對(duì)象引用))
這三種比較
但卻不能Primitive1 (基本類型).equals( Primitive2(基本類型));
對(duì)于基本類型,沒有面向?qū)ο笾邪l(fā)送消息一說(shuō),自然也不會(huì)有
方法成員。
2)比較目的角度:
1) 如果要比較兩個(gè)基本類型是否相等,請(qǐng)用= =;
2) 如果要比較兩個(gè)對(duì)象引用是否相等,請(qǐng)用= =;
3) 如果要比較兩個(gè)對(duì)象(邏輯上)是否一致,請(qǐng)用equals;
對(duì)兩個(gè)對(duì)象(邏輯上)是否一致的闡釋:
有人會(huì)問:在C++中, 比較兩個(gè)對(duì)象相等不是也可以用==嗎?我知道您是指運(yùn)算符重載,但是很遺憾,Java中不支持運(yùn)算符重載(java中亦有重載過(guò)運(yùn)算符,他們是“+”,“+=”,不過(guò)也僅此兩個(gè),而且是內(nèi)置實(shí)現(xiàn)的);所以,對(duì)象的是否相等的比較這份責(zé)任就交由 equals()來(lái)實(shí)現(xiàn)。
這個(gè)“邏輯上”其實(shí)就取決于人類的看法,實(shí)際開發(fā)中,就取決于用戶的需求;
有人會(huì)有看法:“取決于人類的看法”太過(guò)寬泛和不嚴(yán)肅,如果某人要兩件
風(fēng)牛馬不相及的事物也相等,equals是否也能作出這樣的比較呢?我們說(shuō)可以的
下面這個(gè)例子說(shuō)明了這一點(diǎn):
- class Horse {
- String Type;
- int Legs;
- //相等的標(biāo)準(zhǔn):腿的數(shù)目相等
- public boolean equals(Object o){
- if(this.Legs==((Cattle)o).Legs){
- return true;
- }
- return false;
- }
- public Horse(String Type,int legs){
- this.Type=Type;
- this.Legs=legs;
- }
- }
- class Cattle
- {
- String Type;
- int Legs;
- //相等的標(biāo)準(zhǔn):腿的數(shù)目相等
- public Cattle(String Type,int legs){
- this.Type=Type;
- this.Legs=legs;
- }
- public boolean equals(Object o){
- if(this.Legs==((Horse)o).Legs){
- return true;
- }
- return false;
- }
- }
- public class EqualsTest{
- public static void main(String[] args)
- {
- Cattle c=new Cattle("I'm the Cattle",4);
- Horse h=new Horse("I'm the Horse",4);
- if(c.equals(h)){
- System.out.println(c.Type);
- System.out.println(h.Type);
- System.out.println("Cattle Equals Horse");
- }
- }
- }
輸出結(jié)果:
"I'm the Cattle"
"I'm the Horse"
"Cattle Equals Horse"
您瞧瞧:牛果真等于了馬,為何相等?因?yàn)槲覀兌x的相等標(biāo)準(zhǔn)是:腿的數(shù)目相等;您會(huì)說(shuō):“這太滑稽”,是滑稽,可這是人類的看法,計(jì)算機(jī)可沒有滑稽的概念,當(dāng)然也沒有“不滑稽”的概念,我們定義了什么相等標(biāo)準(zhǔn),他就踏踏實(shí)實(shí)的為我們實(shí)現(xiàn)了;
所以說(shuō):相等標(biāo)準(zhǔn)(即需求)一定要定好,否則,滑稽的事可就多了
第三節(jié):equals()緣起:
equals()是每個(gè)對(duì)象與生俱來(lái)的方法,因?yàn)樗蓄惖淖罱K基類就是Object(除去Object本身);而equals()是Object的方法之一。
我們不妨觀察一下Object中equals()的source code:
- public boolean equals(Object obj) {
- return (this == obj);
- }
注意 “return (this == obj)”
this與obj都是對(duì)象引用,而不是對(duì)象本身。所以equals()的缺省實(shí)現(xiàn)就是比較
對(duì)象引用是否一致;為何要如此實(shí)現(xiàn)呢?前面我們說(shuō)過(guò):對(duì)象是否相等,是由我們的需求決定的,世界上的類千奇百怪(當(dāng)然,這些類都是我們根據(jù)模擬現(xiàn)實(shí)世界而創(chuàng)造的),雖然Object是他們共同的祖先,可他又怎能知道他的子孫類比較相等的標(biāo)準(zhǔn)呢?但是他明白,任何一個(gè)對(duì)象,自己總是等于自己的,何謂“自己總是等于自己”呢,又如何判斷“自己總是等于自己”呢?一個(gè)對(duì)象在內(nèi)存中只有一份,但他的引用卻可以有無(wú)窮多個(gè),“對(duì)象自己的引用1=對(duì)象自己的引用2”,不就能判斷“自己總是等于自己”嗎?所以缺省實(shí)現(xiàn)實(shí)現(xiàn)自然也就是
“return (this == obj)”;
而到了我們自己編寫的類,對(duì)象相等的標(biāo)準(zhǔn)由我們確立,于是就不可避免的要覆寫
繼承而來(lái)的public boolean equals(Object obj);
如果您有過(guò)編覆寫過(guò)equals()的經(jīng)驗(yàn)(沒有過(guò)也不要緊),請(qǐng)您思考一個(gè)問題:
“兩個(gè)對(duì)象(邏輯上)是否一致”實(shí)際上是比較什么?沒錯(cuò),或許您已脫口而出:
就是對(duì)象的屬性(即field,或稱數(shù)據(jù)成員)的比較。方法是不可比較的哦。(這個(gè)問題是不是有些弱智呢?哈哈)
第四節(jié):對(duì)一個(gè)推論的思考
推論如下:一言以蔽之:欲比較棧中數(shù)據(jù)是否相等,請(qǐng)用= =;
欲比較堆中數(shù)據(jù)是否相等,請(qǐng)用equals;
因?yàn)椋ǜ┗绢愋?,(根)?duì)象引用都在棧中; 而對(duì)象本身在堆中;
這句話又對(duì)又不對(duì),問題出在哪,就是“數(shù)據(jù)”二字,先看棧中,數(shù)據(jù)或?yàn)榛绢愋?,或?yàn)閷?duì)象引用,用==比較當(dāng)然沒錯(cuò);但是堆中呢?對(duì)象不是堆中嗎?不是應(yīng)該用equals比較嗎?可是,我們比較的是堆中“數(shù)據(jù)”,堆中有對(duì)象,對(duì)象由什么構(gòu)成呢?可能是對(duì)象引用,可能是基本類型,或兩者兼而有之。如果我們要比較他們,該用什么呢,用”equals()”?不對(duì)吧,只能是”= =”!所以正確的結(jié)論是:欲比較棧中數(shù)據(jù)是否相等,請(qǐng)用= =; 欲比較堆中數(shù)據(jù)是否相等,請(qǐng)用equals;
因?yàn)椋ǜ┗绢愋?,(根)?duì)象引用都在棧中(所謂“根”,指未被任何其他對(duì)象所包含);而對(duì)象本身在堆中。
到這,==和equals的區(qū)別介紹完了,希望對(duì)你有幫助。
【編輯推薦】
- Java 多線程同步問題的探究(一)
- Java 多線程同步問題的探究(二)
- 詳細(xì)介紹JAVA和C++區(qū)別
- JAVA開發(fā) 分析JNI標(biāo)準(zhǔn)原理
- 解析Java軟件開發(fā)中的五種認(rèn)識(shí)誤區(qū)
新聞名稱:簡(jiǎn)單介紹==和equals區(qū)別
標(biāo)題來(lái)源:http://www.dlmjj.cn/article/dpgsogj.html


咨詢
建站咨詢
