Dieses Mal sprechen wir über das Konzept von "same" in Java.
Ersteres heißt "gleich" und letzteres heißt "gleich".
Object hoge = new Object();
Object huga = hoge; //Kopieren Sie die Hoge-Referenz und weisen Sie sie huga zu
Zu diesem Zeitpunkt sollen Hoge und Huga gleich sein. Die Identität wird vom Operator == beurteilt.
Zum Beispiel
Object hoge = new Object();
Object huga = new Object();
huga = hoge;
Trotzdem sind Hoge und Huga nicht gleich (weil sie unterschiedliche Instanzen sind).
public class Cat{
private String name;
public Cat(String name) {
this.name = name;
}
}
Erstellen Sie mit der Klasse zwei Instanzen mit demselben Namenswert.
Cat hoge = new Cat("neko");
Cat huga = new Cat("neko");
Wie im vorherigen Abschnitt erwähnt, sind diese beiden Instanzen nicht identisch, da sie unterschiedliche Referenzen haben. Jede Referenz hat jedoch den gleichen Wert. Ein solcher Zustand wird gesagt, dass Hoge und Huga den gleichen Wert haben.
** Äquivalenz kann nicht mit == beurteilt werden. ** hoge == huga gibt false zurück.
Verwenden Sie die Methode equals, um die Äquivalenz zu bestimmen. ** Die in der Object-Klasse definierte Methode equals ist jedoch eine Implementierung, die die Identität überprüft. ** ** **
public boolean equals(Object obj){
return (this == obj);
}
Daher wird durch Überschreiben der Methode ** gleich bestimmt, ob verschiedene Instanzen denselben Wert (gleichen Wert) haben. ** ** **
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;
}
}
In diesem Fall können Sie die Äquivalenz mithilfe von hoge.equals (huga) beurteilen. Übrigens ist es abhängig davon, wie die Überschreibung der Equal-Methode geschrieben wird, zu beurteilen, dass in einer Klasse mit mehreren Werten, wenn einer der Werte übereinstimmt, dieser als der gleiche Wert betrachtet wird.
Der String-Typ ist ein Datentyp vom Referenztyp, eine Instanz kann jedoch nur mit einem String-Literal (eingeschlossen in "") erstellt werden. ** Mit Ausnahme von Instanzen, die mit diesem Zeichenfolgenliteral erstellt wurden, kann der Operator == verwendet werden, um die Äquivalenz zu bestimmen. ** ** **
public static void main(String[] args) {
String a= "neko";
String b = "neko";
System.out.println(a == b); //Gibt mit true zurück
}
Dies liegt daran, dass das Zeichenfolgenliteral als konstanter Wert im Speicherbereich für die von der Instanz abweichende Konstante erstellt wird und es einen Mechanismus namens "Konstantenpool" zum Wiederverwenden der Referenz gibt.
Dies ist jedoch nur bei Verwendung eines Zeichenfolgenliteral möglich. Wenn Sie also mit dem neuen Operator eine Variable vom Typ Ring erstellen, können Sie die Äquivalenz mit dem Operator == nicht beurteilen.
Gründliche Erfassung der Java SE11 Silver-Problemsammlung
Recommended Posts