日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础提升篇:equals()方法和“==”运算符

發布時間:2025/3/20 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

1public class TestEquals {2public static void main(String[] args) 3{4int a = 3;5int b = 4;6int c = 3;7System.out.println(a == b);//結果是false8System.out.println(a == c);//結果是true9System.out.println(a.equals(c));//錯誤,編譯不能通過,equals方法 10//不能運用與基本類型的比較 11} 12}
  • 對于基本類型的包裝類型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變量,==是比較地址的,而equals是比較內容的。

1public class TestEquals {2public static void main(String[] args) 3{ Integer n1 = new Integer(30);4Integer n2 = new Integer(30);5Integer n3 = new Integer(31);6System.out.println(n1 == n2);//結果是false 兩個不同的Integer對象,故其地址不同,7System.out.println(n1 == n3);//那么不管是new Integer(30)還是new Integer(31) 結果都顯示false8System.out.println(n1.equals(n2));//結果是true 根據jdk文檔中的說明,n1與n2指向的對象中的內容是相等的,都是30,故equals比較后結果是true9System.out.println(n1.equals(n3));//結果是false 因對象內容不一樣,一個是30一個是31 10} 11}

這是Integer的實例,如果是其他的比如Double、Character、Float等也一樣。

附上熱門QQ群,存放資源和歷史資料,500容量(低門檻付費群),長按二維碼入群


????????????????????????????????????????????? ? ?? 長按二維碼關注

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Java基础提升篇:equals()方法和“==”运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。