Cette fois, nous parlons du concept de «même» en Java.
Le premier est appelé «même» et le second est appelé «égal».
Object hoge = new Object();
Object huga = hoge; //Copiez la référence hoge et attribuez-la à huga
À ce moment, on dit que hoge et huga sont les mêmes. L'identité est jugée par l'opérateur ==.
Par exemple
Object hoge = new Object();
Object huga = new Object();
huga = hoge;
Même ainsi, hoge et huga ne sont pas les mêmes (car ce sont des instances différentes).
public class Cat{
private String name;
public Cat(String name) {
this.name = name;
}
}
Créez deux instances avec la même valeur de nom à l'aide de la classe.
Cat hoge = new Cat("neko");
Cat huga = new Cat("neko");
Comme mentionné dans la section précédente, ces deux instances ne sont pas les mêmes car elles ont des références différentes. Cependant, chaque référence a la même valeur. Un tel état est dit que hoge et huga ont la même valeur.
** L'équivalence ne peut pas être jugée avec ==. ** hoge == huga renvoie false.
Utilisez la méthode d'égalité pour déterminer l'équivalence. ** Cependant, la méthode equals définie dans la classe Object est une implémentation qui vérifie l'identité. ** **
public boolean equals(Object obj){
return (this == obj);
}
Par conséquent, si différentes instances ont la même valeur (valeur égale) est déterminée en remplaçant la méthode ** equal. ** **
public static class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public boolean equals(Object obj) {
if (obj == null){
return false;
}
if (obj instanceof Cat){
Cat cat = (Cat) obj;
return cat.name == this.name;
}
return false;
}
}
Si tel est le cas, vous pouvez juger de l'équivalence en utilisant hoge.equals (huga). En passant, selon la manière d'écrire le remplacement de la méthode equal, il est possible de juger que dans une classe avec plusieurs valeurs, si l'une des valeurs correspond, elle est considérée comme la même valeur.
Le type String est un type de données de type référence, mais une instance ne peut être créée qu'avec une chaîne littérale (entre ""). ** À l'exception des instances créées avec ce littéral de chaîne, l'opérateur == peut être utilisé pour déterminer l'équivalence. ** **
public static void main(String[] args) {
String a= "neko";
String b = "neko";
System.out.println(a == b); //Renvoie avec vrai
}
Cela est dû au fait que le littéral de chaîne est créé en tant que valeur constante dans l'espace mémoire pour les constantes différentes de l'instance, et qu'il existe un mécanisme appelé «pool de constantes» pour réutiliser les références.
Cependant, ce n'est que lorsque vous utilisez un littéral de chaîne, donc si vous créez une variable de type Ring avec l'opérateur new, vous ne pouvez pas juger de l'équivalence avec l'opérateur ==.
Capture approfondie de la collecte des problèmes Java SE11 Silver
Recommended Posts