[JAVA] Überschreiben wir den Unterschied zwischen == (Identität) und der Methode equals (Äquivalenz).

Es gibt zwei "gleiche" in Java.

== (Identität)

Der Operator == stellt fest, dass sie identisch sind. Das heißt, es wird bestimmt, dass sich mehrere Variablen auf dieselbe Instanz beziehen.


A a = new A(); //Erstellen Sie eine Instanz mit dem Namen Typ A.
A b = a; //Kopieren Sie jede Instanz von a nach b wie sie ist
System.out.println(a == b); 
true

Beispiel


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); //Instanziierung des Probentyps
		Sample s1 = s0; //Nach s1 kopieren
		s0 = new Sample(5); //Erstellen Sie eine neue Beispieltypinstanz
		System.out.println(s0 == s1);
	}
}
false

Zum Zeitpunkt des Kopierens mit "Sample s1 = s0;" hatte es dieselbe Instanz, aber in der nächsten Zeile erstellte "s0" eine neue Instanz, und "s0" und "s1" wurden zu unterschiedlichen Instanzen.

entspricht Methode

Die Methode equals bestimmt, dass sie gleich sind. Das heißt, die Instanzen sind unterschiedlich, es wird jedoch bestimmt, ob sie denselben Wert haben.

Die in der Standardobjektklasse definierte Methode equals lautet

public boolean equals(Object obj){
  return (this == obj);
}

Weil es definiert ist als und es eine Spezifikation ist, um die Identität zu bestätigen

*** Es wird angenommen, dass es durch Überschreiben verwendet wird. *** ***

des Weiteren! !!

*** Wenn Sie die Methode equals überschreiben, müssen Sie auch den Hashcode in der Menge überschreiben. *** ***

Object(Java SE 11 & JDK 11)

equals Beachten Sie, dass Sie beim Überschreiben dieser Methode im Allgemeinen immer die hashCode-Methode überschreiben und die allgemeine Konvention der hashCode-Methode befolgen sollten, wonach äquivalente Objekte den äquivalenten Hash-Code enthalten müssen.

Beispiel


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) {
        //Streit(num, name)Ist dasselbe
		Sample a = new Sample(5, "xxx"); 
		Sample b = new Sample(5, "xxx");
		System.out.println(a.equals(b));
        //Geben Sie jeden Hashcode aus
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
	}
}
true
3694926
3694926

Überschreiben der Methoden equals und hashCode.

Wenn auch nur eine Nummer oder ein Name unterschiedlich ist, ist dies wie folgt.


public class Main {
	public static void main(String[] args) {
        //Streit(name)Ist anders
		Sample a = new Sample(5, "xxx");
		Sample b = new Sample(5, "yyy"); 
		System.out.println(a.equals(b));
        //Geben Sie jeden Hashcode aus
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
	}
}
false
3694926
3725709

Das gleiche Urteil ist "falsch" und für hashCode wird ein anderer Wert ausgegeben.

Recommended Posts

Überschreiben wir den Unterschied zwischen == (Identität) und der Methode equals (Äquivalenz).
Unterschied zwischen == Operator und Methode gleich
[Java] Unterschied zwischen == und gleich
Unterschied zwischen Instanzmethode und Klassenmethode
Unterschied zwischen dem Operator == und der Methode eqals
Was ist der Unterschied zwischen einer Aktion und einer Instanzmethode?
Jetzt im dritten Jahr ist das Missverständnis, das ich bemerkt habe, der Unterschied zwischen der Gleichheitsmethode und ==
Der Unterschied zwischen der Ruby-Instanzmethode und der Klassenmethode ist leicht zu verstehen.
Über den Unterschied zwischen irb und pry
[Rails] Ich habe den Unterschied zwischen neuer Methode, Speichermethode, Erstellungsmethode und Erstellungsmethode untersucht.
[Java] Verstehe den Unterschied zwischen List und Set
[iOS] Verstehe den Unterschied zwischen Frame und Grenzen
[Rails / Active Record] Über den Unterschied zwischen create und create!
Verstehe den Unterschied zwischen abstrakten Klassen und Schnittstellen!
Was ist der Unterschied zwischen SimpleDateFormat und DateTimeFormatter? ??
[Schienen] Unterschied zwischen Erstellungsmethode und neuer + Speichermethode
Lassen Sie uns den Unterschied zwischen Interpreter und Compiler anhand des Ben-Diagramms erklären
Unterschied zwischen vh und%
Unterschied zwischen i ++ und ++ i
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
Was ist der Unterschied zwischen Systemspezifikation und Funktionsspezifikation?
So senden Sie Ethereum-Transaktionen Unterschied zwischen send und sendAsync
Unterschiede zwischen Klassen und Instanzen in Ruby
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
Vergleichen Sie den Unterschied zwischen Docker-Datei vor und nach Docker-Slim
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Was ist der Unterschied zwischen Überspringen und Ausstehend? [RSpec]
[Swift] UITextField hat mir den Unterschied zwischen Null und "" beigebracht.
[Java] Hinweis zum Unterschied zwischen Äquivalenzbeurteilung und Gleichheitsbeurteilung beim Vergleich von String-Klassen
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
[Rails] Was ist der Unterschied zwischen Bundle-Installation und Bundle-Update?
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Bundle und Bundle-Installation
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Unterschied zwischen List und ArrayList
Unterschied zwischen .bashrc und .bash_profile
Unterschied zwischen StringBuilder und StringBuffer
Unterschied zwischen render und redirect_to
Der Unterschied zwischen der Programmierung mit Ruby-Klassen und der Programmierung ohne Ruby-Klassen
Erwägen Sie die Implementierung einer Methode, die die Differenz zwischen zwei Listen zurückgibt
Unterschiede zwischen get und gets.chomp (außer Zeilenumbrüchen)