2017-09-11 2 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"); 
     } 
    } 
} 

Pourquoi cette sortie "Faux"? Si c'est par défaut en Java que "tous les objets ne sont pas égaux même s'ils ont les mêmes valeurs" alors comment puis-je "persuader" Java que ces deux objets sont effectivement égaux? D'accord, même si deux chiens ont le même nom, la même taille, le même poids, on peut être dalmatine et l'autre pitbull, et même s'ils sont la même "race", ils peuvent toujours être différents les uns des autres. PS: Je comprends qu'en disant si (un == deux) {} nous comparons si tous les deux se réfèrent au même objet sur le tas, .equals sur la chaîne compare s'ils ont les mêmes caractères dans le même ordre.Pourquoi cet exemple de code .equals() renvoie-t-il "false"?

+0

Je vais être difficile à travailler si vous ne remplace pas égal ... –

+0

@Harald Ce n'est pas la même chose. C'est pourquoi certaines chaînes '==' fonctionnent et d'autres pas. – corsiKa

Répondre

7

La méthode égale par défaut indique "Est-ce le même objet en mémoire?" sauf si vous le remplacez.

Vous ne l'avez pas remplacé.

Le comportement n'a pas changé.

Vous souhaitez ajouter une nouvelle méthode comme celui-ci

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

Stephan apporte un bon point - jamais, jamais, jamais implment sans égal hashCode. Toujours utiliser les mêmes champs dans les deux.

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

N'oubliez pas de surcharger la méthode hashCode() aussi. – Stephan

+0

@Stephan 1000% oui. Les hashtaps iront complètement busto autrement! – corsiKa

3

Vous devez remplacer votre méthode égale dans votre classe Dog. Sinon, vous comparez simplement si ces objets sont la même instance en mémoire.

Voici une implémentation de la façon de procéder:

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

Toute Ide vous permettent de générer hashcode et égaux de manière automatique accesseurs.

Dans votre cas sans hashcode et égal à vous obtiendrez false, car les objets ne peuvent pas être au même emplacement de mémoire.

Votre (de travail) exemple ci-dessous:

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"); 
     } 
    } 
} 

Résultat:

enter image description here

Pour générer hashcode et égaux de manière automatique dans Eclipse:

clic droit dans votre classe et :

enter image description here

+0

Je comprends vaguement ce que vous essayez de dire, mais je ne comprends pas (encore) l'implémentation de ce code. Dans tous les cas, merci! – Krushe

+0

Je n'ai pas écrit de lignes de code, je laisse eclipse le faire pour moi, de toute façon quand vous appelez 'one.equals (two)', vous appelez les équivalents overriden, où ** this ** c'est l'objet ** one * * et ** obj ** c'est l'objet ** deux **. – Frank

+0

Merci pour l'explication, semble un peu plus clair maintenant haha ​​Comment laissez-vous éclipse faire cela pour vous? – Krushe