什么是==?
品牌網(wǎng)站建設(shè),== 等于比較運(yùn)算符,如果進(jìn)行比較的兩個(gè)操作數(shù)都是數(shù)值類型,即使他們的數(shù)據(jù)類型不相同,只要他們的值相等,也都將返回true.如果兩個(gè)操作數(shù)都是引用類型,那么只有當(dāng)兩個(gè)引用變量的類型具有父子關(guān)系時(shí)才可以比較,而且這兩個(gè)引用必須指向同一個(gè)對(duì)象,才會(huì)返回true.(在這里我們可以理解成==比較的是兩個(gè)變量的內(nèi)存地址)
什么是equals()?
equals()方法是Object類的方法,在Object類中的equals()方法體內(nèi)實(shí)際上返回的就是使用==進(jìn)行比較的結(jié)果.但是我們知道所有的類都繼承Object,而且Object中的equals()方法沒(méi)有使用final關(guān)鍵字修飾,那么當(dāng)我們使用equal()方法進(jìn)行比較的時(shí)候,我們需要關(guān)注的就是這個(gè)類有沒(méi)有重寫Object中的equals()方法.
區(qū)別
== 是java提供的等于比較運(yùn)算符,用來(lái)比較兩個(gè)變量指向的內(nèi)存地址是否相同.而equals()是Object提供的一個(gè)方法.Object中equals()方法的默認(rèn)實(shí)現(xiàn)就是返回兩個(gè)對(duì)象==的比較結(jié)果.但是equals()可以被重寫,所以我們?cè)诰唧w使用的時(shí)候需要關(guān)注equals()方法有沒(méi)有被重寫.
坑
int 和 Integer
結(jié)果:
重點(diǎn):
System.out.println(a == d); 同樣的表達(dá)式,不同的值為什么結(jié)果不同
System.out.println(a == c); 與 System.out.println(a == d); 同樣的對(duì)象類型,為什么復(fù)制方式不一樣,比較結(jié)果不一樣
System.out.println(a == c); 與 System.out.println(a.equals?); 不同的比較方式,結(jié)果為什么不同
解析思路:
首先我們看a,c,d三個(gè)變量的賦值方式,其中a和d的賦值方式都是直接賦值,沒(méi)有調(diào)用new關(guān)鍵字,只有d的賦值方式調(diào)用了new關(guān)鍵字.然后我們?cè)诳促x值的具體數(shù)值,一組是5在-128 ~ +127 之間,另一組是128在/-128 ~ +127 之外.我們可以通過(guò)已知的不同點(diǎn)去閱讀源碼.(其中不同的比較方式為什么結(jié)果不同,這個(gè)可以猜出一定是Integer重寫了equals()方法.)
結(jié)論:
賦值方式中如果調(diào)用了new關(guān)鍵字,一定會(huì)在內(nèi)存中給你分配一個(gè)新的地址
給Integer類型賦值的時(shí)候,如果沒(méi)有調(diào)用new關(guān)鍵字,并且值在-128與+127之間,包括-128和+127,那么指向的都是同一個(gè)內(nèi)存位置.
Integer類中重寫了equals()方法,使用equals()方法進(jìn)行比較的時(shí)候,實(shí)際上比較的內(nèi)存中最終指向的值的內(nèi)存位置,不是直接比較變量的內(nèi)存位置.
重寫的equals()方法
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)