理一理java與C#中的equals方法和“==”來進行相等判斷

前言:相信網上類似的博客很多了,但兩種語言的這個對比着來理解的很少,最近在做C#項目時產生了這個想法,今天寫這篇博客是爲了幫助自己不會忘記,也希望能幫助到看到這篇文章的你。談到對比,那肯定這兩種語言中的equals和==有點兒不一樣,嘿嘿,怎麼個不一樣,我們下面來看看。


一、java中的equals和==

1.你若不對“==”運算符進行重操作,那進行的就是棧空間值類型的比較,如:

                                                                   圖(1)

 

                                     圖(2)

所以,也就是 2和3的比較,不相等返回false。

對應的,你若用“==”運算符來比較引用類型的變量會如何呢?

                                                                       圖(3)

答案是false,原因如下圖:

                                                           圖(4)

也即car1這個變量的值是地址1,car2這個變量的值是地址2。兩個的值(堆空間的地址)是不相等,下圖這樣也就能明白了。

                                                                           圖(5)

2.我們知道,equals方法可以用來比較兩個引用類型的內容是否相等,但這是對於重寫了object類的equals方法而言的,

如String、Date以及Double、Integer等類而言的。

對於自定義類,如上面的Car,若直接使用equals方法來判斷其內容是否相等就會得到false

                                                                        圖(6)

原因是object類equals方法內部執行的是“==”判斷,源碼如下圖

                                                       圖(7)

圖(7)來源於https://www.cnblogs.com/dolphin0520/p/3592500.html

因此,我們藉助於String對Car的equals方法進行簡單重寫後判斷

                                                                                                       圖(8)

這樣就能判斷兩個引用類型的內容是否一樣了。

二、C#中的equals和==

我們都知道,C#出現在java之後,裏面的許多特性都和java一樣,就如本專題,所有的類都繼承自object基類,object類中都有equals方法,C#中的equals方法是虛方法即virtual修飾的,這就清楚地表明其子類在需要這個方法時重寫一下,java和C#中的“==”運算符(你若不進行重操作)都是比較的值類型,這裏不再作圖描述。

需要說明的是,C#中的String方法既重寫了“==”運算符,又重寫了equals方法,兩個都能對引用內容進行比較。

如下圖:

                                                                                     圖(9)

原因在於String類在進行“==”比較時,其運算符內部調用的是equals方法,如下圖:

                                         圖(10)

圖(10)來源於https://www.cnblogs.com/chen0720/p/3209398.html

對java和C#的String類進行總結:

1)java中的String 類只對equals方法進行了重寫,讓其能夠對引用變量的內容進行比較。

2)C#中的String類對equals方法和“==”運算符都進行了重寫,equals方法重寫了之後和java一樣,“==”運算符重寫調用了equals方法。

以上就是兩種語言的equals和“==”運算符在做比較時的原理以及在用的最多的String中的使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章