[JAVA] Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)

Différence entre équivalence et équivalence

Comme une partie qui semble être incorrecte dans le résultat du test Java Silver que j'ai reçu l'autre jour "Utilisez == et equals () pour tester si une chaîne est égale à un autre objet" A été mentionné, donc je vais l'écrire comme une critique.

Référence [Introduction à Java qui peut être clairement comprise](

<div style = "border: 1px solid # 95a5a6; border-radius: .75rem" ; background-color: #FFFFFF; width: 184px; margin: 0px; padding: 5px; text-align: center; overflow: hidden; ">
<a href = "https://hb.afl.rakuten.co.jp/ichiba/1aecd7df.780bbf06.1aecd7e0.a0859005/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16099007%2F&link_type= picttext & ut = eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiI4MHg4MCIsIm5hbSI6MSwibmFtcCI6InJpZ2h0IiwiY29tIjoxLCJjb21wIjoiZG93biIsInByaWNlIjoxLCJib3IiOjEsImNvbCI6MSwiYmJ0biI6MSwicHJvZCI6MH0% 3D "target =" _ blank "rel =" nofollow noopener sponsorisé "style =" word-wrap: break-word; "> <img src =" https://hbb.afl.rakuten.co.jp/ hgb / 1aecd7df.780bbf06.1aecd7e0.a0859005 /?me_id=1213310&item_id=19815844&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%284%2Fbook%2Fcabinet%2F7%2Fcabinet%2F7% = 80x80 & t = picttext "border =" 0 "style =" margin: 2px "alt =" [Pour le prix du produit, un lien est créé Les informations peuvent changer à ce moment et à ce moment. ] "title =" [Concernant les prix des produits, les informations peuvent avoir changé au moment de la création du lien et à ce moment. ] "> </ td>

<a href =" https://hb.afl.rakuten.co.jp/ichiba/1aecd7df.780bbf06.1aecd7e0.a0859005/? pc = https% 3A% 2F% 2Fitem.rakuten.co.jp% 2Fbook% 2F16099007% 2F & link_type = picttext & ut = eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiI4MHg4MCIsIm5hbSI6MSwibmFtcCI6InJpZ2h0IiwiY29tIjoxLCJjb21wIjoiZG93biIsInByaWNlIjoxLCJib3IiOjEsImNvbCI6MSwiYmJ0biI6MSwicHJvZCI6MH0% 3D "target =" _ blank "rel =" nofollow noopener sponsorisé "style =" word-wrap: break-word ; "> Une introduction rafraîchissante à la 3e édition de Java [Kiyotaka Nakayama]
Prix: 2860 yens (taxes incluses, livraison gratuite) </ span> (À partir du 07/08/2020) </ span> </ p> </ td> </ tr> </ table> </ div>

</ p> </ td> </ tr> </ table>)


public class Human {
  String name;
  int hp;

  public String toString(){
   return "name:" + this.name + "/age:" + this.age;
 }
}

Dans le cas ci-dessus Valeur égale

Jugement de (==) "Exactly the same existence" = "pointant vers la même valeur d'adresse"

same.java


Human h1 = new Human("Taro")
Human h2 = h1;

Puisque h1 est assigné à h2, il a la même instance A "nom: Taro". La destination de référence fait également référence à la même adresse au 2112. A ce moment, "h1 == h2" tient.

Équivalent

equals.java


Human h1 = new Human("Ziro");
Human h2 = new Human("Ziro");

Créer chaque instance → se référer à Instance A "nom: Ziro" → 3322 Instance B "nom: Ziro" → 9191 "H1! = H2" tient Cependant, le contenu de la chaîne de caractères est le même Par conséquent, "h1.equalsa (h2)" est valable.

Oui, je comprends. Mais, Si vous continuez avec [Introduction à Java que vous pouvez comprendre clairement]([Introduction à Java que vous pouvez comprendre clairement]) et entrez le chapitre sur l'utilisation des API dans la seconde moitié Il y a une instruction qui equals () ne fonctionne pas correctement à moins que vous ne spécifiiez les critères d'évaluation de «ce qui fait la même chose», mais c'est un peu déroutant.

Ce qui suit ne fonctionne pas correctement Exemple 1) Comparez deux personnes

public class Main {
  public static void main(String[] args) {
    Human h1 = new Human();
    h1.name = "Taro";
    h1.age = 10;    

    Human h2 = new Human();
    h2.name = "Taro";
    h2.age = 10;

    if ( h1.equals(h2) == true ) {
      System.out.println("Same");
    } else {
    System.out.println("different") ;
    }
  }
}

Le contenu de traitement de equals () hérité de la classe Object est le suivant "Pour le moment, si les valeurs sont égales, renvoie true." Sera sous la forme de


public boolean equals(Object o) {
  if (this == o) { 
    return true; 
} else {
    return false;
  }
}

"Ce qu'il faut considérer comme le même contenu" est différent pour chaque classe, donc Doit être défini individuellement En d'autres termes, spécifiez en "remplaçant les égaux"

La condition est "Si les noms sont les mêmes, ils sont considérés comme le même humain" Ensuite, ce sera comme suit


public class Human {
 String name;
 int age;

public boolean equals(Object o ) {
  if (this == o) { 
  return true;
}  if (o instanceof Human) { //Le remplacement supplémentaire suivant: Déterminez si o peut être converti en type humain
  Human h = (Human)o;  //(2) Downcast Object type o to Human type and assign it to h
  if ( this.name.equals(h.name)) {
    return true; 
    }  
   }
    return false;
  }
}


"SAME" s'affiche

Recommended Posts