[JAVA] Remplaçons la différence entre == (identité) et méthode equals (équivalence)

Il y a deux "mêmes" dans java.

== (identité)

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

exemple


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.

méthode égale

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. *** ***

Object(Java SE 11 & JDK 11)

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.

exemple


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

Remplaçons la différence entre == (identité) et méthode equals (équivalence)
Différence entre l'opérateur == et la méthode égale
[Java] Différence entre == et égal
Différence entre la méthode d'instance et la méthode de classe
Différence entre l'opérateur == et la méthode eqals
Quelle est la différence entre une action et une méthode d'instance?
Maintenant dans la troisième année, le malentendu que j'ai remarqué est la différence entre la méthode equals et ==
Facile à comprendre la différence entre la méthode d'instance Ruby et la méthode de classe.
À propos de la différence entre irb et pry
[Rails] J'ai étudié la différence entre une nouvelle méthode, une méthode de sauvegarde, une méthode de construction et une méthode de création.
[Java] Comprendre la différence entre List et Set
[iOS] Comprendre la différence entre le cadre et les limites
[Rails / Active Record] À propos de la différence entre créer et créer!
Comprenez la différence entre les classes abstraites et les interfaces!
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??
[Rails] Différence entre la méthode de création et la méthode nouvelle + sauvegarde
Expliquons la différence entre l'interpréteur et le compilateur en utilisant le diagramme de Ben
Différence entre vh et%
Différence entre i ++ et ++ i
[Ruby] J'ai réfléchi à la différence entre each_with_index et each.with_index
[Rails] J'ai étudié la différence entre les ressources et les ressources
Quelle est la différence entre System Spec et Feature Spec?
Comment envoyer des transactions Ethereum Différence entre send et sendAsync
Différences entre les classes et les instances dans Ruby
[Rails] Quelle est la différence entre la redirection et le rendu?
Comparez la différence entre dockerfile avant et après docker-slim
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Quelle est la différence entre ignorer et en attente? [RSpec]
[Swift] UITextField m'a appris la différence entre nil et ""
[Java] Remarque sur la différence entre le jugement d'équivalence et le jugement d'égalité lors de la comparaison de classes String
Différence entre produit et variante
Différence entre redirect_to et render
[Rails] Quelle est la différence entre l'installation et la mise à jour du bundle?
Différence entre Java et JavaScript (comment trouver la moyenne)
Différence entre redirect_to et render
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre classe et instance
Différence entre l'installation de bundle et de bundle
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
Différence entre List et ArrayList
Différence entre .bashrc et .bash_profile
Différence entre StringBuilder et StringBuffer
Différence entre render et redirect_to
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
Envisagez d'implémenter une méthode qui renvoie la différence entre deux listes
Différences entre gets et gets.chomp (autres que les sauts de ligne)