⑴ java中equals方法詳解有哪些
因為你的Value類沒有重寫equals 方法,這個方法是在Object類中定義的,是可以自己按照需要進行重寫的,如果沒有重寫,其默認的邏輯是比較兩個相互equals 的對象的內存地址是不是同一個地址,第一個輸出的時候v1,v2都是new出來的,所以v1和v2在堆中是不同的內存地址,所以equals結果為false
第二個輸出,其調用的是Integer類的equals,Integer類中有重寫原有equals方法的邏輯,其邏輯是比較兩個Integer對象中封裝的數字的值,如果相同就返回true,因此第二個輸出true
第三個輸出false原理同第一個,兩個對象之間使用==比較的就是內存地址,因為都是new出來的,堆內存地址不同,所以輸出false
簡單來講,如果來自同一個類的兩個對象,如果沒有重寫equals方法的邏輯,其==結果和equals結果是相同的,如果有重寫equals方法,則==和equals結果可能會不同
⑵ JAVA中字元串比較equals和equalsIgnoreCase的區別
equals和equalsIgnoreCase的區別是:equals考慮大小寫,equalsIgnoreCase忽略大小寫。
equals,方法展示:
publicbooleanequals(ObjectanObject)
將此字元串與指定的對象比較。當該參數不為 null,並且是與此對象表示相同字元序列的 String
對象時,結果才為 true,否則為false。
equalsIgnoreCase,方法展示:
publicbooleanequalsIgnoreCase(StringanotherString)
將此 String 與另一個 String
比較,不考慮大小寫。如果兩個字元串的長度相同,並且其中的相應字元都相等(忽略大小寫),則認為這兩個字元串是相等的;
當參數不為 null,且這兩個 String 相等(忽略大小寫),則返回
true,否則返回 false。
舉例:
Stringa="lol";
Stringb="Lol";
System.out.println(a.equals(b));//輸出為false
System.out.println(a.equalsIgnoreCase(b));//輸出為true
⑶ C#初學者對Equals方法的幾個常見誤解
很多C#的教材都會強調對象相等的概念。我們都知道,在C#的世界裡存在兩種等同性。一種是邏輯等同性:如果兩個對象在邏輯上代表同樣的值,則稱他們具有邏輯等同性。另一種是引用等同性:如果兩個引用指向同一個對象實例,則稱他們具有引用等同性。
眾所周知,Object類型有一個名為Equals的實例方法可以用來確定兩個對象是否相等。Object的Equals的默認實現比較的是兩個對象的引用等同性。而Object的派生類ValueTpye重寫了Equals方法,它比較的是兩個對象的邏輯等同性。也就是說,在C#里,引用類型的默認Equals版本關注的是引用等同性,而值類型關注的是邏輯等同性。當然,這並不總能滿足我們的要求。所以每當我們更在意引用類型的邏輯等同性的時候,我們就應該重寫Equals方法。
重寫引用類型的Equals方法以改變其默認的比較方式的一個著名例子是String類。當我們寫出「string1.Equals(string2)」這樣的代碼時,我們比較的不是string1和string2這兩個引用所指向的是否為同一個實例(引用等同性),而是比較string1與string2所包含的字元序列是否相同(邏輯等同性)。
誤解一:Equals方法和operator==具有相同的默認行為。
對於引用類型,如果沒有為它重載==操作符,且其父類型也沒有重寫Equals方法,則這個引用類型Equals方法和operator==具有相同的默認行為,即它們比較的都是對象的引用等同性。然而對於值類型來說,就完全不是這么回事了!因為如果你沒有為自定義值類型重載operator==的話,就不能寫這樣的代碼「myStruct1 == myStruct2」,否則會得到一個編譯錯誤,原因是值類型沒有相等操作符重載的默認實現。
誤解二:自定義類的Equals的方法默認實現將自動調用operator==方法,或operator==方法的默認實現將自動調用Equals方法。
經常聽到有人說某某類型是引用類型,所以它的Equals方法的默認實現將自動調用operator==方法。這種說法完全是沒有道理的。正如上文所說的,引用類型Equals方法的默認實現來自Object,而值類型的默認實現來自TypeValue,就算他們會使用==操作符,使用的也是Object或TypeValue的重載版本。原則上來說,只要我們沒有重寫一個類的Equals方法,那麼它就會繼承其父類的實現,而父類是沒有機會使用子類型的操作符重載的。同樣,只要我們沒有在一個類的==操作符重載中調用Equals方法,它是不會自動調用的。
誤解三:值類型的默認Equals實現是對兩個對象進行逐位比較的。
有些人認為值類型的Equals默認實現就是通過比較兩個對象在內存中的位表示,即如果所有的二進制位都相等,則說明這兩個對象「等同」。這是不準確的。因為其實值類型的Equals默認實現是對值類型的每個欄位都調用該欄位類型的Equals方法,如果所有欄位的Equals方法都返回true,則他們才可能相等。來看一個例子:
很顯然,a和b擁有完全不同的二進制位表示。但是最終列印的結果是:
?
MyClass的Equals方法被調用了。True
這說明值類型的默認實現是通過調用欄位的Equals方法來確定兩個對象是否相等,而不是通過比較他們的二進制位是否一致來確定的。
誤解四:Equals是非常基本、非常常用的方法,所以其默認的實現不存在性能問題。
對於引用類型,Equals的默認實現很簡單,僅僅需要判斷兩個引用是不是同一種類型、兩個引用指向的是不是同一塊內存就可以了。所以其性能也沒有問題。但是對於值類型,Equals的任務就沒有這么簡單了。它需要對兩個對象的所有欄位都做出比較,即逐欄位調用欄位類型的Equals。由於在ValueType(值類型Equals方法默認實現的位置)中,不可能知道它所有的子類型都包含哪些欄位,所以為了調用子類型欄位的Equals方法,ValueType的Equals就需要使用反射技術。您可能已經看出來了,反射並不是一種性能友好的技術,所以值類型的Equals方法算不上高效。這也正是為什麼微軟推薦我們為自定義值類型重寫Equals方法的原因。
⑷ java equals()方法
當obj1==obj2不成立而obj1.equals(obj1)成立的時候,只能說明:對象obj1所屬類的equals方法被重寫了。
例如String類的equals被重寫為比較兩個字元串的內容是否相同。
⑸ 關於java中equals方法的疑惑
equals 方法是 java.lang.Object 類的方法。
有兩種用法說明:
(1)對於字元串變數來說,使用「==」和「equals()」方法比較字元串時,其比較方法不同。
「==」比較兩個變數本身的值,即兩個對象在內存中的首地址。
「equals()」比較字元串中所包含的內容是否相同。
比如:
String s1,s2,s3 = "abc", s4
="abc" ;
s1 = new String("abc");
s2 = new String("abc");
那麼:
s1==s2 是 false //兩個變數的內存地址不一樣,也就是說它們指向的對象不 一樣,
故不相等。
s1.equals(s2) 是 true //兩個變數的所包含的內容是abc,故相等。
注意(1):
如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer 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"方法的作用是相同的都是用來比較其
對象在堆內存的首地址,即用來比較兩個引用變數是否指向同一個對象。
比如:
class A
{
A obj1 = new A();
A obj2 = new A();
}
那麼:obj1==obj2是false
obj1.equals(obj2)是false
但是如加上這樣一句:obj1=obj2;
那麼 obj1==obj2 是true
obj1.equals(obj2) 是true
總之:equals方法對於字元串來說是比較內容的,而對於非字元串來說是比較
其指向的對象是否相同的。
== 比較符也是比較指向的對象是否相同的也就是對象在對內存中的的首地址。
String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以是true。
⑹ equals方法在哪些地方有如何區別
equals一般是用於字元串的對比 比如 "".equals(string); 意思就是說 拿空字元串去跟string這個變數去做對比
⑺ equals的簡介
equals 方法(是String類從它的超類Object中繼承的)
==用於比較引用和比較基本數據類型時具有不同的功能:
比較基本數據類型,如果兩個值相同,則結果為true
而在比較引用時,如果引用指向內存中的同一對象,結果為true
⑻ equals 的用法
equals 方法是 java.lang.Object 類的方法。
有兩種用法說明:
(1)對於字元串變數來說,使用「==」和「equals()」方法比較字元串時,其比較方法不同。
「==」比較兩個變數本身的值,即兩個對象在內存中的首地址。
「equals()」比較字元串中所包含的內容是否相同。
比如:
String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
那麼:s1==s2 是 false //兩個變數的內存地址不一樣,說明指向的對象不 一樣,故不相等。
s1.equals(s2) 是 true //兩個變數的所包含的內容是abc,故相等。
注意(1):
如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
結果: s1.equals(s2) //是false
解釋:StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類,
而Object類中的equals方法是用來比較「地址」的,所以等於false.
注意(2):
對於s3和s4來說,由於s3和s4是兩個字元串常量所生成的變數,其中所存放的內存地址是相等的,所以s3==s4是true(即使沒有s3=s4這樣一個賦值語句)。