Java基础提升篇:equals()方法和“==”运算符
點擊上方“好好學java”,選擇“置頂公眾號”
優秀學習資源、干貨第一時間送達!
好好學java
java知識分享/學習資源免費分享
關注
?精彩內容?
你所需要的java全套視頻教程
你所需要的java電子圖書
你所需要的大數據視頻教程
你所需要的java練習項目
equals()
超類Object中有這個equals()方法,該方法主要用于比較兩個對象是否相等。該方法的源碼如下:
1public boolean equals(Object obj) { 2 ? ?return (this == obj); 3 ? ?}我們知道所有的對象都擁有標識(內存地址)和狀態(數據),同時“==”比較兩個對象的的內存地址,所以說使用Object的equals()方法是比較兩個對象的內存地址是否相等,即若object1.equals(object2)為true,則表示equals1和equals2實際上是引用同一個對象。雖然有時候Object的equals()方法可以滿足我們一些基本的要求,但是我們必須要清楚我們很大部分時間都是進行兩個對象的比較,這個時候Object的equals()方法就不可以了,實際上JDK中,String、Math等封裝類都對equals()方法進行了重寫。下面是String的equals()方法:
1public boolean equals(Object anObject) {2 ? ?if (this == anObject) {3 ? ? ? ?return true;4 ? ?}5 ? ?if (anObject instanceof String) {6 ? ? ? ?String anotherString = (String)anObject;7 ? ? ? ?int n = count;8 ? ? ? ?if (n == anotherString.count) {9 ? ? ? ?char v1[] = value; 10 ? ? ? ?char v2[] = anotherString.value; 11 ? ? ? ?int i = offset; 12 ? ? ? ?int j = anotherString.offset; 13 ? ? ? ?while (n-- != 0) { 14 ? ? ? ? ? ?if (v1[i++] != v2[j++]) 15 ? ? ? ? ? ?return false; 16 ? ? ? ?} 17 ? ? ? ?return true; 18 ? ? ? ?} 19 ? ?} 20 ? ?return false; 21 ? ?}對于這個代碼段:if (v1[i++] != v2[j++])return false;我們可以非常清晰的看到String的equals()方法是進行內容比較,而不是引用比較。至于其他的封裝類都差不多。
equals()方法和“==”運算符比較
首先籠統的來講 ? “java中equals()方法和“==”運算符” ? 都是比較的地址,那為什么我們在使用中總會出現混淆的情況呢老是弄錯呢,這是因為“重寫equals()方法”和一些 “特殊情況”的存在。
有兩種用法說明:
(1)對于字符串變量來說,使用“==”和“equals()”方法比較字符串時,其比較方法不同。
“==”比較兩個變量本身的值,即兩個對象在內存中的首地址。
“equals()”比較字符串中所包含的內容是否相同。
比如:
1String s1,s2,s3 = "abc", s4 ="abc" ; 2s1 = new String("abc"); 3s2 = new String("abc");結果:
s1==s2 是 false ? ? ?//兩個變量的內存地址不一樣,也就是說它們指向的對象不 一樣,故不相等。
s1.equals(s2) 是 true ? ? //兩個變量的所包含的內容是abc,故相等。
注意(1):
如果:
1StringBuffer s1 = new StringBuffer("a"); 2StringBuffer s2 = new StringBuffer("a");結果: ? ? ? ? ?s1.equals(s2) //是false
解釋:
StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類,而Object類中的equals方法是用來比較“地址”的,所以等于false.
注意(2):
對于s3和s4來說,有一點不一樣要引起注意,由于s3和s4是兩個字符串常量所生成的變量,其中所存放的內存地址是相等的,所以s3==s4是true(即使沒有s3=s4這樣一個賦值語句)
(2)對于非字符串變量來說,"=="和"equals"方法的作用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
比如:
1class A 2{ 3 ? ? ?A obj1 ? = ? ?new A(); 4 ? ? ?A obj2 ? = new A(); 5}結果:
obj1==obj2是false
obj1.equals(obj2)是false
但是如加上這樣一句:obj1=obj2;
結果 :
obj1==obj2 是true
obj1.equals(obj2) 是true
總之
equals方法對于字符串來說是比較內容的,而對于非字符串來說是比較其指向的對象是否相同的。
== 比較符也是比較指向的對象是否相同的也就是對象在對內存中的的首地址。
String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以是true。
注意:
如果是基本類型比較,那么只能用==來比較,不能用equals
對于基本類型的包裝類型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變量,==是比較地址的,而equals是比較內容的。
這是Integer的實例,如果是其他的比如Double、Character、Float等也一樣。
附上熱門QQ群,存放資源和歷史資料,500容量(低門檻付費群),長按二維碼入群
????????????????????????????????????????????? ? ?? 長按二維碼關注
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java基础提升篇:equals()方法和“==”运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础提升篇:理解String 及
- 下一篇: 特别的520,送给特别的你们,还不来看看