Il y a deux "mêmes" dans java.
L'opérateur == détermine qu'ils sont identiques. Autrement dit, il est déterminé qu'une pluralité de variables se réfèrent à la même instance.
A a = new A(); //Créer une instance appelée type A
A b = a; //Copiez chaque instance de a vers b telle quelle
System.out.println(a == b);
true
public class Sample {
private int num;
public Sample(int num) {
this.num = num;
}
}
public class Main {
public static void main(String[] args) {
Sample s0 = new Sample(5); //Instanciation du type d'échantillon
Sample s1 = s0; //Copier vers s1
s0 = new Sample(5); //Créer une nouvelle instance de type Sample
System.out.println(s0 == s1);
}
}
false
Au moment de la copie avec Sample s1 = s0;
, il avait la même instance, mais sur la ligne suivante, s0
créa une nouvelle instance, et s0
et s1
devinrent des instances différentes.
La méthode égale détermine qu'ils sont égaux. Autrement dit, les instances sont différentes, mais il est déterminé si elles ont la même valeur.
La méthode equals définie dans la classe Object par défaut est
public boolean equals(Object obj){
return (this == obj);
}
Parce qu'il est défini comme, et c'est une spécification pour confirmer l'identité
*** Il est supposé être utilisé par substitution. *** ***
plus loin! !!
*** Lors de la substitution de la méthode equals, vous devez également remplacer le hashCode dans l'ensemble. *** ***
equals Gardez à l'esprit qu'en général, lors du remplacement de cette méthode, vous devez toujours remplacer la méthode hashCode et suivre la convention générale de la méthode hashCode selon laquelle les objets équivalents doivent contenir le code de hachage équivalent.
public class Sample {
private int num;
private String name;
public Sample(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + num;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Sample other = (Sample) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (num != other.num)
return false;
return true;
}
}
public class Main {
public static void main(String[] args) {
//argument(num, name)Est le même
Sample a = new Sample(5, "xxx");
Sample b = new Sample(5, "xxx");
System.out.println(a.equals(b));
//Sortir chaque hashCode
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
true
3694926
3694926
Remplacer les méthodes equals et hashCode.
Si même un numéro ou un nom est différent, ce sera comme suit.
public class Main {
public static void main(String[] args) {
//argument(name)Est différent
Sample a = new Sample(5, "xxx");
Sample b = new Sample(5, "yyy");
System.out.println(a.equals(b));
//Sortir chaque hashCode
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
false
3694926
3725709
Le jugement égal est «false», et une valeur différente est sortie pour hashCode.
Recommended Posts