java equals和==的區(qū)別詳解
大概說equals和==都比較的是什么:
1. boolean tem = a == b;
首先==比較的肯定是地址,從堆棧的角度說也就是說==比較的是棧上面的內(nèi)容。因?yàn)闂J怯脕泶娣诺刂坊蚴莏ava中八大基本類型中自動(dòng)變量的字面值(自動(dòng)變量就是用int a = 1;這種形式來定義的變量)。如果是自動(dòng)變量比較值的話肯定是用==來比較,因?yàn)閑quals()是一個(gè)方法,所以必須由對(duì)象調(diào)用才可以用于比較。而自動(dòng)變量既不是類的實(shí)例也不是類的引用所以不能用equals()方法。
2.boolean tem = a.equals("b");
equals()方法一般用于比較的是對(duì)象的內(nèi)容但是也有的情況下也會(huì)去比較兩個(gè)對(duì)象的地址。
接下來
寫一個(gè)測(cè)試程序
package com; import java.util.Date; public class test { public static void main(String[] args) { Integer integer1 = new Integer(1); Integer integer2 = new Integer(1); String str1 = new String("123"); String str2 = new String("123"); Date date1 = new Date(); Date date2 = new Date(); Double double1 = new Double("1.0"); Double double2 = new Double("1.0"); Boolean tem1 = new Boolean(true); Boolean tem2 = new Boolean(true); Object object1 = new Object(); Object object2 = new Object(); System.out.println("----Object------"); System.out.println(object1.equals(object2)); System.out.println(object1 == object2); System.out.println(object1.equals(object1)); System.out.println(object1 == object1); System.out.println("----Boolean------"); System.out.println(tem1.equals(tem2)); System.out.println(tem1 == tem2); System.out.println("----Double------"); System.out.println(double1.equals(double2)); System.out.println(double1 == double2); System.out.println("----Integer------"); System.out.println(integer1.equals(integer2)); System.out.println(integer1 == integer2); System.out.println("----String------"); System.out.println(str1.equals(str2)); System.out.println(str1 == str2); System.out.println("----Date------"); System.out.println(date1.equals(date2)); System.out.println(date1 == date2); } }
結(jié)果:
----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
----Date------
true
false
首先對(duì)Object的比較,當(dāng)比較的兩個(gè)對(duì)象一樣時(shí),==和equals()的結(jié)果都是true,當(dāng)兩個(gè)對(duì)象不一樣時(shí)返回的都是false。所以在==和equals用于比較對(duì)象時(shí),他們比較的都是對(duì)象的地址,其實(shí)本質(zhì)是一樣的。下面是Object類中equals()方法的代碼:
public boolean equals(Object obj) { return (this == obj); }
而對(duì)于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他們的源碼,下面我依次貼出來在Boolean,Double,Interger,String,Date這些類中equals()方法的源碼,這時(shí)候equals()方法就被重寫了,因?yàn)檫@些類都是繼承于Object類的嘛。
Boolean:
public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false; }
Double:
public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }
Interger:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
String:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
Date:
public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); }
也就是說在這些時(shí)候重寫了Object類的equals()方法用于比較兩個(gè)對(duì)象實(shí)際的內(nèi)容而不再是地址了,當(dāng)然肯定不只是這些,這里只是舉出了幾個(gè)比較常見的java原生類重寫Object類的equals()方法的情況。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
在springboot中攔截器Filter中注入bean失敗問題及解決
這篇文章主要介紹了在springboot中攔截器Filter中注入bean失敗問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外
這篇文章主要介紹了使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08詳解Java繼承中屬性、方法和對(duì)象的關(guān)系
這篇文章主要幫助大家詳細(xì)介紹了Java繼承中屬性、方法和對(duì)象的關(guān)系,感興趣的朋友可以參考一下2016-03-03jar包的各種啟動(dòng)方式超詳細(xì)總結(jié)
jar文件是一種軟件包文件格式,通常用于聚合大量的JAVA類文件,以jar為文件擴(kuò)展名,下面這篇文章主要給大家介紹了關(guān)于jar包的各種啟動(dòng)方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04關(guān)于IDEA的junit單元測(cè)試Scanner輸入不可用的問題(多種原因分析)
IDEA在Junit測(cè)試中使用了Scanner,但是控制臺(tái)一直轉(zhuǎn)圈,無法輸入,eclipse默認(rèn)可用,其實(shí)解決方法很多,今天小編給大家分享多種問題原因分析及解決方法,感興趣的朋友一起看看吧2021-06-06Java求10到100000之間的水仙花數(shù)算法示例
這篇文章主要介紹了Java求10到100000之間的水仙花數(shù)算法,結(jié)合實(shí)例形式分析了水仙花數(shù)的概念及相應(yīng)的java算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對(duì)屬性賦值
這篇文章主要介紹了 java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對(duì)屬性賦值的相關(guān)資料,需要的朋友可以參考下2017-01-01Java使用ProcessBuilder?API優(yōu)化流程
Java?的?Process?API?為開發(fā)者提供了執(zhí)行操作系統(tǒng)命令的強(qiáng)大功能,這篇文章將詳細(xì)介紹如何使用?ProcessBuilder?API?來方便的操作系統(tǒng)命令,需要的可以收藏一下2023-06-06