Beherrschen Sie die Verwendung von Gleichheit anhand der folgenden Beispiele
package cn.galc.test;public class TestEquals { public static void main(String[] args) { /** * Hier wird die Konstruktionsmethode Cat() verwendet, um zwei neue Katzen im Heap-Speicher zu erstellen sind Farbe, Gewicht und Höhe sind alle gleich, * aber c1 und c2 werden niemals gleich sein. Dies liegt daran, dass c1 und c2 Referenzobjekte der beiden Katzen im Heapspeicher sind, *. Es enthält die Adressen, an denen die beiden Katzen zu finden sind. Da die beiden Katzen jedoch an zwei unterschiedlichen Stellen im Heapspeicher gespeichert sind, enthalten * c1 und c2 unterschiedliche Adressen, sodass c1 und c2 niemals gleich sind. */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("Das Ergebnis von c1==c2 ist: "+(c1== c2 ));//false System.out.println("Das Ergebnis von c1.equals(c2) ist: "+c1.equals(c2));//false }}class Cat { int color, Gewicht, Höhe; öffentliche Katze (int color, int height) { this.color = this.height = height }}Zeichnen Sie ein Speicheranalysediagramm, um die Ergebnisse des Vergleichs zwischen c1 und c2 zu analysieren
Programm:
Katze c1 = neue Katze(1,1,1);Katze c2 = neue Katze(1,1,1);
Nach der Ausführung sieht das Layout im Speicher wie folgt aus:
c1 zeigt auf ein Objekt und c2 zeigt auch auf ein Objekt. C1 und c2 enthalten die im Heapspeicher dieser beiden Cat-Objekte gespeicherten Adressen. Da sich die beiden Cat-Objekte in unterschiedlichen Speicherbereichen befinden, enthalten c1 und c2 die Adressen von sind definitiv nicht gleich, also sind die beiden Referenzobjekte c1 und c2 definitiv nicht gleich. Wenn Sie daher Folgendes ausführen: „System.out.println(c1==c2);“ ist das gedruckte Ergebnis definitiv falsch. Sie erstellen also zwei Objekte mit new. Keine Sorge, die Referenzen der beiden Objekte werden niemals identisch sein. Dies ist nicht möglich. Ob c1 gleich c2 ist, vergleicht den Inhalt der beiden Referenzen c1 und c2, da die Referenzen der beiden von new erzeugten Objekte niemals gleich sind und daher auch die Inhalte der beiden Referenzen c1 und c2 niemals gleich sind c1 kann niemals gleich c2 sein. Daher kann der Vergleich der Referenzen zweier Objekte niemals dazu führen, dass die beiden Objekte gleich oder identisch sind.
Um festzustellen, ob zwei Objekte gleich sind, können Sie nicht vergleichen, ob die Referenzen der beiden Objekte gleich sind. Sie erhalten nie ein gleiches Ergebnis, da die Referenzen der beiden Objekte niemals gleich sind. Daher besteht die richtige Vergleichsmethode darin, diese direkt zu vergleichen zwei Objekte und vergleichen Sie, ob die Essenz der beiden Objekte gleich ist, das heißt, ob der Inhalt der beiden Objekte gleich ist. Bestimmen Sie, ob die beiden Objekte gleich sind, indem Sie vergleichen, ob die Attributwerte der beiden Objekte gleich sind sind gleich.
Die Object-Klasse stellt eine equal()-Methode bereit, um zu vergleichen, ob der Inhalt zweier Objekte gleich ist. Daher können wir diese Methode verwenden, um zu vergleichen, ob die beiden Objekte logisch „gleich“ sind. Beispiel: c1.equals(c2); Hier ist der Aufruf der Methode equal(), die von der Object-Klasse geerbt wurde. Die Definition der Methode equals in der Object-Klasse lautet wie folgt:
öffentlicher boolescher Wert gleicht (Objekt obj)
Die Standardimplementierung der in der Object-Klasse bereitgestellten Equals()-Methode besteht darin, die Referenz des aktuellen Objekts und die Referenz, die Sie vergleichen möchten, zu vergleichen, um zu sehen, ob sie auf dasselbe Objekt verweisen, was dasselbe ist wie „c1==c2“. ". , "c1.equals(c2)" und "c1==c2" sind völlig gleichwertig. Daher kann die geerbte Methode equal() nicht direkt verglichen werden, ob der Inhalt zweier Objekte gleich ist. Aus diesem Grund müssen wir die Methode equal() überschreiben und die Standardimplementierung dieser Methode ändern.
Als nächstes schreiben Sie die geerbte Methode equal() in der Cat-Klasse neu:
class Cat { int color, Weight, height; public Cat(int color, intweight, int height) { this.color = color; this.height = height } /** * Dies ist eine Umschreibung der Gleichheit Die von der Object-Klasse geerbte Methode equal() ändert die Standardimplementierung dieser Methode. * Verwenden Sie unsere eigene definierte Implementierung, um zu bestimmen, ob zwei Objekte logisch gleich sind. * Hier definieren wir Folgendes: Wenn Farbe, Gewicht und Größe zweier Katzen gleich sind, * denken wir, dass die beiden Katzen logisch identisch sind, das heißt, die beiden Katzen sind „gleich“. */ public boolean equal(Object obj){ if (obj==null){ return false } else{ /** * Instanz von ist ein Objektoperator. * Der Objektoperator wird verwendet, um zu bestimmen, ob ein Objekt zu einer Instanz einer bestimmten Klasse oder einer bestimmten Unterklasse gehört. * Der Objektoperator ist eine kombinierte Wortinstanz von. * Dieser Operator ist ein binärer Operator. * Wenn das Objekt links ein von der Klasse rechts erstelltes Objekt ist, ist das Ergebnis der Operation wahr, sonst ist es falsch. */ if (obj exampleof Cat){ Cat c = (Cat)obj; if (c.color==this.color && c.weight==this.weight && c.height==this.height){ return true; } } } return false; }} Führen Sie zu diesem Zeitpunkt den Druckbefehl in der Hauptmethode aus:
public static void main(String[] args) { /** * Hier wird die Konstruktionsmethode Cat() verwendet, um zwei neue Katzen im Heap-Speicher zu erstellen. * Farbe, Gewicht und Höhe dieser beiden Katzen sind gleich . * Aber c1 und c2 werden niemals gleich sein. Dies liegt daran, dass c1 und c2 die Adressen der beiden Katzen im Heapspeicher sind, sondern weil die beiden Katzen im gespeichert sind Heap-Speicher In zwei verschiedenen Räumen, * C1 und c2 enthalten also unterschiedliche Adressen, sodass c1 und c2 niemals gleich sein werden. */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("Das Ergebnis von c1==c2 ist: "+(c1== c2 ));//false System.out.println("Das Ergebnis von c1.equals(c2) ist: "+c1.equals(c2));//true }Das dieses Mal erhaltene Ergebnis unterscheidet sich vom Ergebnis, das beim letzten Mal erhalten wurde, ohne die Methode equal() zu überschreiben:
„System.out.println(c1 == c2);“ Das gedruckte Ergebnis ist immer noch falsch, da die Inhalte der Referenzen der beiden Objekte natürlich nicht gleich sind und niemals gleich sein werden gleich sind, daher muss das gedruckte Ergebnis falsch sein.
„System.out.println(c1.equals(c2));“ Das gedruckte Ergebnis ist wahr, da wir die Methode equal() in der Cat-Klasse neu geschrieben und die Standardimplementierung dieser Methode geändert haben die Methode nur ändern Wenn diese beiden Objekte wirklich existieren und beide Katzen sind und ihre Farbe, Größe und Gewicht gleich sind, dann sind die beiden Katzen logisch identisch und genau gleich. Zwei Katzen, das heißt, diese beiden Katzen sind „gleich“. Das hier abgedruckte Ergebnis ist also wahr.
Wie vergleicht man also zwei String-Objekte auf Gleichheit?
Schauen Sie sich das folgende Beispiel an:
öffentliche Klasse TestEquals { public static void main(String args[]){ String s1 = new String("hello"); String s2 = new String("hello"); System.out.println("s1 == s2 result Is : "+(s1 == s2));//false System.out.println("Das Ergebnis von s1.equals(s2) ist: "+s1.equals(s2));//true }}Diesmal werden die beiden String-Objekte auf Gleichheit verglichen:
System.out.println(s1 == s2);
Das gedruckte Ergebnis ist immer noch falsch, da hier die Referenzen der beiden Zeichenfolgenobjekte s1 und s2 verglichen werden. Die Referenzen der beiden Objekte werden niemals gleich sein, sodass das gedruckte Ergebnis falsch ist.
System.out.println(s1.equals(s2));
Das gedruckte Ergebnis ist wahr, da die Vererbung von der Object-Klasse in der String-Klasse umgeschrieben wird (alle Klassen werden von der Object-Klasse geerbt, und die String-Klasse ist natürlich keine Ausnahme. Wenn Sie von der übergeordneten Klasse erben, haben Sie alles Attribute und Methoden, daher verfügt die Sting-Klasse auch über die Methode equal() und die geerbte Methode equal() wurde ebenfalls neu geschrieben, wodurch die Standardimplementierung dieser Methode geändert wurde.
In der String-Klasse wird die Implementierung der Methode equal() wie folgt überschrieben: Vergleichen Sie das aktuelle String-Objekt mit dem angegebenen String-Objekt. Das angegebene String-Objekt darf nicht leer sein und die Zeichenfolge dieses Objekts ist mit der aktuellen Zeichenfolge identisch . Die String-Sequenzen der Objekte sind gleich. Wenn diese Bedingungen erfüllt sind, sind die beiden String-Objekte gleich.
Daher hat s2 hier die Bedingung erfüllt, sodass das gedruckte Ergebnis wahr ist.
Wenn Sie in Zukunft zwei Objekte in einer bestimmten Klasse auf Gleichheit vergleichen, lesen Sie zunächst die API-Dokumentation, um herauszufinden, ob diese Klasse die von der Object-Klasse geerbte Methode equal() überschrieben hat. Wenn die Methode equal() überschrieben wird, wird beim Vergleich, ob zwei Objekte gleich sind, die überschriebene Methode equal() aufgerufen. Wenn sie nicht überschrieben wird, wird die von der Object-Klasse geerbte Methode equal() aufgerufen verwendet die Standardimplementierung der Methode equal(), um zu vergleichen, ob zwei Objekte gleich sind. Daher kann jede Klasse bei Bedarf die von der Object-Klasse geerbte Methode equal() überschreiben.
Um eine bestimmte Klasse im API-Dokument zu finden und eine Klasse direkt zu verwenden, ohne ein Paket einzuführen, muss sich diese Klasse im Paket java.lang befinden. Hier kann beispielsweise die String-Klasse direkt verwendet werden, also die String-Klasse muss sein. Es befindet sich im Paket java.lang. Wenn Sie eine bestimmte Klasse verwenden, überprüfen Sie, welches Paket die Klasse importiert, und suchen Sie dann nach der Klasse, für die keine Pakete importiert werden müssen. Gehen Sie einfach direkt zu java.lang, um sie zu finden .
Wenn wir eine Klasse entwerfen, müssen wir im Allgemeinen die Methode „equals“ der übergeordneten Klasse überschreiben. Beim Umschreiben dieser Methode müssen wir sie gemäß den folgenden Regeln entwerfen:
1. Reflexivität: Für jeden Referenzwert X muss der Rückgabewert von x.equals(x) wahr sein.
2. Symmetrie: Für jeden Referenzwert x, y muss der Rückgabewert von x.equals(y) genau dann wahr sein, wenn der Rückgabewert von y.equals(x) wahr ist;
3. Transitivität: Wenn x.equals(y)=true, y.equals(z)=true, dann x.equals(z)=true
4. Konsistenz: Wenn sich die am Vergleich teilnehmenden Objekte nicht ändern, sollte sich auch das Ergebnis des Objektvergleichs nicht ändern.
5. Nicht-Nullbarkeit: Für jeden Referenzwert X ungleich Null muss der Rückgabewert von x.equals(null) falsch sein
Zum Beispiel:
public class People { private String firstName; private int name; public void setFirstName (string firstName) { return lastName; } public void setLastName(String lastName) { this.lastName = lastName } public int getAge() { return age } public void setAge(int age) { this.age = age; } @Override public boolean equal(Object obj) { if (this == obj) return true; if (obj == null) return false; return false; People other = (People) obj; if (age != other.age) return false if (firstName == null) { if (other.firstName != null) return if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false } else if (!lastName.equals(other.lastName)) return false; ; return true; }}
In diesem Beispiel legen wir fest, dass eine Person dieselbe Person ist, wenn ihr Nachname, Vorname und Alter gleich sind. Natürlich können Sie auch andere Attribute hinzufügen. Beispielsweise muss die ID-Nummer dieselbe sein, um als dieselbe Person beurteilt zu werden. Dann können Sie die ID-Nummer-Beurteilung in der Gleichheitsmethode hinzufügen.
Zusammenfassung: Um zu vergleichen, ob zwei Objekte gleich sind, verwenden wir die Methode equal(). Die Bedingungen für die Beurteilung, ob zwei Objekte gleich sind, werden von uns definiert, nachdem wir die Implementierung der Methode equal() neu geschrieben haben, damit die Methode equal() dies kann flexibler einsetzbar Vergleichen Sie zwei Objekte derselben Klasse in verschiedenen Klassen, um festzustellen, ob sie gleich sind.