當我看到equals()
方法的執行時,它與==
的做法沒什麼兩樣。所以我的問題是,當我們有==
運算符執行相同的工作時,需要將此作爲單獨的方法使用?爲什麼equals()方法當我們有==運算符?
回答
你不能重載==
運營商,但是你可以重寫equals(Object)
如果你想讓它的行爲不同於==
運營商,即無法比擬的引用,但實際上比較(例如使用全部或部分各自領域)的對象。
此外,如果您確實覆蓋equals(Object)
,那麼也請看hashCode()
。這兩種方法需要兼容(即根據equals(Object)
需要相同的兩個對象需要具有相同的hashCode()
),否則會出現各種奇怪的錯誤(例如,將對象添加到集合或映射時)。
==
比較對象引用,並詢問兩個引用是否相同。
equals()
比較對象內容,並詢問對象是否表示相同的概念。
除非你正在比較值類型...... – 2010-05-05 11:44:32
@David:除非你正在談論原始值,否則Java中的「值類型」不存在。 – 2010-05-05 11:46:40
對不起 - 我的意思是不能在Java中創建值類型。 – 2010-05-05 14:18:17
「串」 == 「字符串」 將返回false 「串」 .equals( 「串」)將返回true
隨着O1 O2 ==您比較的對象1比O2同一個對象(供參考)
隨着o1.equals(02),根據不同的對象equals方法被重寫,而不是與像實施「迴歸01 == 02」
對於爲例創建2個實例 這2個設置對象是2個不同的對象,你可以在其中添加不同的元素。 set1 == set2將始終返回假 但set1.equals(set2)最終將返回true,如果set2包含與set1 ...完全相同的元素並且因爲equals方法在Set類中被覆蓋...
Equals已實施設置爲:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Set))
return false;
Set s = (Set) o;
if (s.size() != c.size())
return false;
return containsAll(s); // Invokes safe containsAll() above
}
我懷疑你的意思是'string1 == string2'和'string1.equals(string2)' - 你的答案中的例子都會返回false。 – 2010-05-05 11:49:07
對不起,我的意思是「字符串」==「字符串」和「字符串」.equals(「字符串」) – 2010-05-05 11:51:33
「字符串」==「字符串」將實際評估爲真。 – jarnbjo 2010-05-05 11:56:39
這就是這樣做使這成爲可能:
String s1 = new String("foo");
String s2 = new String("foo");
System.out.println(s1 == s2); // false?! Different references!
System.out.println(s1.equals(s2)); // true
如果選中的String#equals()
來源,你會看到,它已經覆蓋了Object#equals()
適當地比較彼此的內部字符數組(實際值值)。許多其他類也都覆蓋了此方法。
這兩者之間有一個非常重要的區別。
「==」比較對象實例。默認的equals()實現也是這樣做的。請運行&分析下面的代碼示例:
public class Person{
String name;
public Person(String name){
this.name = name;
}
//overriding equals
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if(name == null) {
if(other.name != null)
return false;
} else if(!name.equals(other.name))
return false;
return true;
}
}
...
...
Person john1 = new Person("John");
Person john2 = new Person("John");
System.out.println("john1 == john2:" + (john1 == john2));
System.out.println("john1.equals(john2):" + john1.equals(john2));
正如你所看到的,「==」將返回false(對象是人的兩個不同的實例),而等號將返回true(因爲我們定義2者是相等的時,他們具有相同的名稱)
在原語情況下,==
操作者檢查如果兩個值是相同的。
如果它不是原語,它會檢查它是否是指向同一個對象實例的兩個指針(或引用)。
的equals()
方法執行自定義檢查,這是在Object
檢查基準,通過使用==
。但在其他類中,有時equals()
被覆蓋(我不知道這是否是正確的過去分詞)。 equals()
必須檢查內容。
因此,舉例來說:
int i0 = 34;
int i1 = 34;
int i2 = 35;
// results
i0 == i1: true
i1 == i0: true
i2 == i0: false
但是,如果我們有非原語
String str0 = new String("Hello man!");
String str1 = new String("Hello man!");
String str2 = new String("!nam olleH");
String str2copy = str2;
// Results
str0 == str1: false // Pointer to two different object, so == will give false
str1 == str2: false // Idem
str2 == str2copy: true // So this are two pointers to the same object
str0.equals(str1): true // This are not the same objects, but they are equal
str1 == str1: true // Again: two times a pointer to the same object
那麼,爲什麼str0.equals(str1)
回報true
?因爲String類有一個覆蓋equals()
。並且在該方法中,它不檢查它們是否相等return this == obj;
但是在該方法中,有一個完整的檢查。我不知道他們使用兩個字符串比較哪一種方法,但這裏有兩種可能的方式:從兩個字符串的哈希碼
- 生成並檢查它們是否相等(
int == int
) - 如果它們相同,則按字符檢查。
所以我希望現在已經很清楚了。
這是一個很好的總結。 正如使用字符串文字時的進一步說明,行爲又是不同的... String str0 =「Hello man!」; String str1 =「Hello man!」; str0 == str1;由於JVM將字符串對象放置在字符串池中,所以會返回true。因此,str1和str2都指向池中的同一個對象。 – mmccomb 2010-05-05 15:17:40
這裏是Nitpicking,但根據定義,兩個*值從不相同(否則,它只會是一個值)。 – fredoverflow 2010-05-05 23:16:53
==運算符用於比較引用。
equals()方法在對象定義上定義。
Dog d =new Dog();
Collar c =new Collar("Red");
d.setCollar(c);
Dog d2=new Dog();
Collar c2=new Collar("Red");
d2.setCollar(c2);
d2.getCollar() ==d.getCollar()
將返回假,則表示該兩隻狗有兩個不同的領對象(項目)。它們不共享相同的衣領。
d2.getCollar().equals(d.getCollar())
返回真,如果衣領被定義爲 兩隻狗具有相同顏色的領[如果領子的顏色都是一樣領相同。
class Collar{
String color="";
public Collar(String p0){
this.color=p0;
}
boolean equals(Object c){
Collar other=(Collar)c;
return this.color.equals(other.getColor());
}
public String getColor(){
return this.color;
}
}
在java中等於運算符(==)上兩個變量的數據,如果操作數是基本數據類型的操作。但是,如果操作數是對象,那麼java會使用引用來比較它們,因爲它無法計算出對象的哪個或哪些字段。
因此,只有一種方法可以根據用戶定義的字段進行比較,並且通過重寫equals()方法在對象中定義,因爲在java中不能覆蓋equals運算符(==),因爲java不支持運算符覆蓋。
舉個例子,如果你想要的名字,你需要定義它的基礎上,比較員工通過重寫邏輯equals方法在如下Employee類:
public class Employee {
private Integer id;
private String name;
@Override
public boolean equals(Object obj) {
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 1. 爲什麼LINQ中的'equals'運算符加入?
- 2. 爲什麼我們使用按位運算符?
- 3. 爲什麼我們甚至需要「delete []」運算符?
- 4. 面試之謎 - 爲什麼我們要重寫了hashCode和equals方法
- 5. php overload equals運算符
- 6. 爲什麼我們調用Object.clone()方法?
- 7. 爲什麼我們需要Buffer.isBuffer方法?
- 8. 爲什麼我們需要addRequestHeader方法?
- 9. 爲什麼我們不能使用帶有浮點數的運算符?
- 10. 當我們使用ROLLUP運算符時,爲什麼我們不能使用DISTINCT關鍵字?
- 11. 符合:Deref和mark運算符,爲什麼它們不一樣?
- 12. 爲什麼listbox1.Items.Add使用我的對象的Equals方法?
- 13. C#中的==運算符和Equals()方法之間的區別?
- 14. equals()方法和==運算符之間的關係
- 15. 爲什麼我們有這麼多種裝配加載方法?
- 16. 'is'運算符爲什麼說這些方法不一樣?
- 17. 匹配方法和=〜運算符有什麼區別?
- 18. 利用按位運算符有什麼好方法?
- 19. 當我們用邏輯運算符返回時,Python返回什麼?
- 20. 在盒裝布爾類型上使用==運算符和Equals方法有什麼區別?
- 21. 我對使用模運算符有什麼想法?
- 22. instanceof運算符 - 爲什麼有非法編譯時錯誤
- 23. 爲什麼要用最後的修改,當我們在方法類有私人
- 24. 爲什麼Python有一個__ne__運算符方法而不是__eq__?
- 25. 爲什麼我們不在運算符重載方法中初始化返回的對象?
- 26. 爲什麼我們在通過super調用時不得不使用__dunder__方法而不是運算符?
- 27. SQL中的IN運算符和=運算符有什麼區別?
- 28. 爲什麼我們無法將方法或類名稱定義爲字符串?
- 29. Ruby中<=>運算符的名稱是什麼?他們稱之爲什麼?
- 30. 爲什麼我們不能使用數組名稱的間接運算符?
+1你的答案是可能性更大。 – 2010-05-05 11:37:50
正確 - 如果要用相同的字段實例化兩個單獨的對象,並在兩個對象上設置相同的字段,則測試相等性仍然會返回false。如果您要覆蓋該類的Equals(),那麼您可以測試這些字段,如果它們相同則返回true。 – 2010-05-05 11:40:50
s/overwrite/override/p – 2010-05-05 11:41:51