2017-09-11 46 views
1
class Dog{ 
    int height; 
    int weight; 
    String name; 
} 

public class DogTest { 

    public static void main(String[] args) { 
     Dog one = new Dog(); 
     one.height=4; 
     one.name="fudo"; 
     one.weight =2; 
     Dog two = new Dog(); 
     two.height=4; 
     two.name="fudo"; 
     two.weight =2; 
     if (one.equals(two)){ 
      System.out.println("True"); 
     } 
     else{ 
      System.out.println("False"); 
     } 
    } 
} 

爲什麼這個輸出是「假」?如果在Java中默認「即使它們具有相同值,所有對象都不相同」,那麼我怎樣才能「說服」Java這兩個對象實際上是平等的呢?好吧,即使兩隻狗有相同的名字,身高,體重,可以是不透明的,另一隻是公牛,即使它們在性質上是相同的「種族」,它們總是可以彼此不同。我知道通過說if(one == two){}我們正在比較它們是否都指向堆上的同一個對象,如果字符串中的.equals比較它們是否具有相同順序的相同字符。爲什麼.equals()代碼示例返回「false」?

+0

如果你不覆蓋等於,我將很難工作... –

+0

@Harald這是不一樣的。這就是爲什麼一些字符串「==」適用於其他字符串,而另一些則不適用。 – corsiKa

回答

7

默認情況下,equals方法表示「這是內存中的同一個對象嗎?」除非你重寫它。

您沒有覆蓋它。

行爲沒有改變。

你要添加一個新的方法,這樣

public boolean equals(Object o) { 
    if(o instanceof Dog) { 
     Dog d = (Dog)(o); 
     Dog t = this; 
     return t.height == d.height && t.weight == d.weight && t.name.equals(d.name); 
    } 
    return false; 
} 

斯蒂芬帶來了一個好點的 - 永遠,永遠,永遠implment等於無的hashCode。總是在兩者中使用相同的字段。

public int hashCode() { 
    int hash = name.hashCode(); 
    hash = hash * 31 + weight; 
    hash = hash * 31 + height; 
    return hash; 
} 
+0

不要忘記重寫hashCode()方法。 – Stephan

+0

@Stephan 1000%是的。哈希馬錶將完全消失! – corsiKa

3

你必須重寫你的Dog類中的equals方法。如果不是,你只是比較這些對象是否是內存中的同一個實例。

這裏是如何做到這一點的實現:

class Dog{ 
    int height; 
    int weight; 
    String name; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof Dog)) return false; 

     Dog dog = (Dog) o; 

     if (height != dog.height) return false; 
     if (weight != dog.weight) return false; 
     return name != null ? name.equals(dog.name) : dog.name == null; 

    } 
} 
3

任何IDE使您能夠生成散列碼和自動方式getter和setter等於。

在你的情況沒有hashcode和等於你會得到false,因爲對象不能在同一個內存位置。

低於你的(工作)例如:

class Dog{ 
    int height; 
    int weight; 
    String name; 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + height; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     result = prime * result + weight; 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Dog other = (Dog) obj; 
     if (height != other.height) 
      return false; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     if (weight != other.weight) 
      return false; 
     return true; 
    } 

    public static void main(String[] args) { 
     Dog one = new Dog(); 
     one.height=4; 
     one.name="fudo"; 
     one.weight =2; 
     Dog two = new Dog(); 
     two.height=4; 
     two.name="fudo"; 
     two.weight =2; 
     if (one.equals(two)){ 
      System.out.println("True"); 
     } 
     else{ 
      System.out.println("False"); 
     } 
    } 
} 

結果:

enter image description here

要生成散列碼,並在eclipse等於在自動方式:

在類

點擊右鍵, :

enter image description here

+0

我隱約明白你在說什麼,但我還沒有理解這個代碼的實現。在任何情況下,謝謝! – Krushe

+0

我沒有寫任何代碼行,我讓eclipse爲我做,無論如何,當你調用'one.equals(2)',你正在調用overriden等於,其中** this **它的對象**一個* *和** obj **其對象**兩個**。 – Frank

+0

感謝您的解釋,現在看起來更清晰哈哈你如何讓日食爲你做到這一點? – Krushe

相關問題