2010-05-05 39 views

回答

41

你不能重載==運營商,但是你可以重寫equals(Object)如果你想讓它的行爲不同於==運營商,即無法比擬的引用,但實際上比較(例如使用全部或部分各自領域)的對象。

此外,如果您確實覆蓋equals(Object),那麼也請看hashCode()。這兩種方法需要兼容(即根據equals(Object)需要相同的兩個對象需要具有相同的hashCode()),否則會出現各種奇怪的錯誤(例如,將對象添加到集合或映射時)。

+0

+1你的答案是可能性更大。 – 2010-05-05 11:37:50

+0

正確 - 如果要用相同的字段實例化兩個單獨的對象,並在兩個對象上設置相同的字段,則測試相等性仍然會返回false。如果您要覆蓋該類的Equals(),那麼您可以測試這些字段,如果它們相同則返回true。 – 2010-05-05 11:40:50

+0

s/overwrite/override/p – 2010-05-05 11:41:51

34

==比較對象引用,並詢問兩個引用是否相同。

equals()比較對象內容,並詢問對象是否表示相同的概念。

+2

除非你正在比較值類型...... – 2010-05-05 11:44:32

+4

@David:除非你正在談論原始值,否則Java中的「值類型」不存在。 – 2010-05-05 11:46:40

+0

對不起 - 我的意思是不能在Java中創建值類型。 – 2010-05-05 14:18:17

0

「串」 == 「字符串」 將返回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 
    } 
+1

我懷疑你的意思是'string1 == string2'和'string1.equals(string2)' - 你的答案中的例子都會返回false。 – 2010-05-05 11:49:07

+0

對不起,我的意思是「字符串」==「字符串」和「字符串」.equals(「字符串」) – 2010-05-05 11:51:33

+5

「字符串」==「字符串」將實際評估爲真。 – jarnbjo 2010-05-05 11:56:39

1

這就是這樣做使這成爲可能:

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()適當地比較彼此的內部字符數組(實際值值)。許多其他類也都覆蓋了此方法。

2

這兩者之間有一個非常重要的區別。

「==」比較對象實例。默認的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者是相等的時,他們具有相同的名稱)

18

原語情況下,==操作者檢查如果兩個是相同的。
如果它不是原語,它會檢查它是否是指向同一個對象實例的兩個指針(或引用

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
  • 如果它們相同,則按字符檢查。

所以我希望現在已經很清楚了。

+0

這是一個很好的總結。 正如使用字符串文字時的進一步說明,行爲又是不同的... String str0 =「Hello man!」; String str1 =「Hello man!」; str0 == str1;由於JVM將字符串對象放置在字符串池中,所以會返回true。因此,str1和str2都指向池中的同一個對象。 – mmccomb 2010-05-05 15:17:40

+0

這裏是Nitpicking,但根據定義,兩個*值從不相同(否則,它只會是一個值)。 – fredoverflow 2010-05-05 23:16:53

2

==運算符用於比較引用。
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; 
    } 
    } 
0

在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; 
    } 


} 
相關問題