Es gibt zwei "gleiche" in Java.
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
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.
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. *** ***
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.
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