Java.lang.object hat zwei sehr wichtige Methoden definiert: public boolean equals(Object obj) und public int hashCode().

equals()-Methode

In Java wird die Methode equals() verwendet, um die Gleichheit zweier Objekte zu vergleichen. Die Gleichheit kann auf zwei Arten verglichen werden:

  • Flacher Vergleich: Die Standardimplementierung der Methode equals ist in der Klasse Java.lang.Object definiert, die einfach überprüft, ob zwei Objektreferenzen (z. B. x und y) auf dasselbe Objekt verweisen. dh es prüft, ob x == y. Da die Objektklasse keine Datenmitglieder hat, die ihren Zustand definieren, wird sie auch als flacher Vergleich bezeichnet.
  • Tiefenvergleich: Angenommen, eine Klasse stellt ihre eigene Implementierung der Methode equals() bereit, um die Objekte dieser Klasse bezüglich des Zustands der Objekte zu vergleichen. Das bedeutet, dass Datenelemente (dh Felder) von Objekten miteinander verglichen werden sollen. Ein solcher Vergleich auf der Grundlage von Datenelementen wird als tiefer Vergleich bezeichnet.

Syntax :

public boolean equals  (Object obj)

// This method checks if some other Object
// passed to it as an argument is equal to 
// the Object on which it is invoked.

Einige Prinzipien der equals()-Methode der Object-Klasse: Wenn ein anderes Objekt gleich einem gegebenen Objekt ist, folgt es diesen Regeln:

  • Reflexiv: Für jeden Referenzwert a sollte a.equals(a) wahr zurückgeben.
  • Symmetrisch: Für alle Referenzwerte a und b muss b.equals(a) wahr zurückgeben, wenn a.equals(b) wahr zurückgeben soll.
  • Transitiv: Wenn a.equals(b) für alle Referenzwerte a, b und c wahr und b.equals(c) wahr zurückgibt, dann sollte a.equals(c) wahr zurückgeben.
  • Konsistent : Für alle Referenzwerte a und b geben mehrere Aufrufe von a.equals(b) konsistent true oder konsistent false zurück, vorausgesetzt, dass keine Informationen geändert werden, die in Gleichheitsvergleichen für das Objekt verwendet werden.

    Hinweis: Für jeden Nicht-Null-Referenzwert a sollte a.equals(null) false zurückgeben.

// Java program to illustrate 
// how hashCode() and equals() methods work
import java.io.*;
  
class Geek 
{
      
    public String name;
    public int id;
          
    Geek(String name, int id) 
    {
              
        this.name = name;
        this.id = id;
    }
      
    @Override
    public boolean equals(Object obj)
    {
          
    // checking if both the object references are 
    // referring to the same object.
    if(this == obj)
            return true;
          
        // it checks if the argument is of the 
        // type Geek by comparing the classes 
        // of the passed argument and this object.
        // if(!(obj instanceof Geek)) return false; ---> avoid.
        if(obj == null || obj.getClass()!= this.getClass())
            return false;
          
        // type casting of the argument. 
        Geek geek = (Geek) obj;
          
        // comparing the state of argument with 
        // the state of 'this' Object.
        return (geek.name == this.name && geek.id == this.id);
    }
      
    @Override
    public int hashCode()
    {
          
        // We are returning the Geek_id 
        // as a hashcode value.
        // we can also return some 
        // other calculated value or may
        // be memory address of the 
        // Object on which it is invoked. 
        // it depends on how you implement 
        // hashCode() method.
        return this.id;
    }
      
}
  
//Driver code
class GFG
{
      
    public static void main (String[] args)
    {
      
        // creating the Objects of Geek class.
        Geek g1 = new Geek("aa", 1);
        Geek g2 = new Geek("aa", 1);
          
        // comparing above created Objects.
        if(g1.hashCode() == g2.hashCode())
        {
  
            if(g1.equals(g2))
                System.out.println("Both Objects are equal. ");
            else
                System.out.println("Both Objects are not equal. ");
      
        }
        else
        System.out.println("Both Objects are not equal. "); 
    } 
}

Ausgabe:

Both Objects are equal.

Im obigen Beispiel siehe die Zeile:

// if(!(obj instanceof Geek)) return false;--> avoid.-->(a)

Wir haben diese Zeile anstelle der obigen Zeile verwendet:

if(obj == null || obj.getClass()!= this.getClass()) return false; --->(y)

Hier vergleichen wir zuerst den HashCode auf beiden Objekten (dh g1 und g2) und wenn der gleiche Hashcode von beiden Objekten generiert wird, bedeutet das nicht, dass sie gleich sind, da der Hashcode auch für verschiedene Objekte gleich sein kann, wenn sie gleich sind ID (in diesem Fall). Wenn also die generierten Hashcode-Werte für beide Objekte gleich sind, vergleichen wir danach die beiden Objekte bezüglich ihres Zustands, für den wir die equals(Object)-Methode innerhalb der Klasse überschreiben. Und wenn beide Objekte gemäß der equals(Object)-Methode den gleichen Zustand haben, dann sind sie gleich, andernfalls nicht. Und es wäre eine bessere Leistung, wenn verschiedene Objekte unterschiedliche Hashcode-Werte generieren.

Grund: Referenz obj kann sich auch auf das Objekt der Unterklasse von Geek beziehen. Zeile (b) stellt sicher, dass sie falsch zurückgibt, wenn das übergebene Argument ein Objekt der Unterklasse der Klasse Geek ist. Die Operatorbedingung instanceof gibt jedoch nicht false zurück, wenn sie feststellt, dass das übergebene Argument eine Unterklasse der Klasse Geek ist. Read InstanceOf- Operator.

hashCode()-Methode

Es gibt den Hashcode-Wert als Integer zurück. Der Hashcode-Wert wird hauptsächlich in hashbasierten Sammlungen wie HashMap, HashSet, HashTable usw. verwendet. Diese Methode muss in jeder Klasse überschrieben werden, die die Methode equals() überschreibt.
Syntax :

public int hashCode()

// This method returns the hash code value 
// for the object on which this method is invoked.

Der allgemeine Vertrag von hashCode lautet:

  • Wenn hashCode() während der Ausführung der Anwendung mehr als einmal für dasselbe Objekt aufgerufen wird, muss es konsistent denselben Integer-Wert zurückgeben, vorausgesetzt, dass keine Informationen geändert werden, die im Gleichheits(Objekt) -Vergleich für das Objekt verwendet werden. Es ist nicht erforderlich, dass dieser ganzzahlige Wert von einer Ausführung der Anwendung zu einer anderen Ausführung derselben Anwendung gleich bleibt.
  • Wenn zwei Objekte gemäß der Methode equals(Object) gleich sind, muss die Methode hashCode() für jedes der beiden Objekte dieselbe Ganzzahl erzeugen.
  • Wenn zwei Objekte gemäß der equals(Object) -Methode ungleich sind, ist es nicht notwendig, dass der von der hashCode()-Methode für jedes der beiden Objekte erzeugte Integer-Wert unterschiedlich ist. Es kann gleich sein, aber das Erzeugen der unterschiedlichen Ganzzahl für jedes der beiden Objekte ist besser, um die Leistung von Hashing-basierten Sammlungen wie HashMap, HashTable usw. zu verbessern.

Hinweis: Gleiche Objekte müssen denselben Hashcode erzeugen, solange sie gleich sind, ungleiche Objekte müssen jedoch keine unterschiedlichen Hashcodes erzeugen.

Zugehöriger Link: Überschreiben von gleich in Java
Referenz: JavaRanch

Dieser Artikel wurde von Nitsdheerendra beigesteuert . Wenn Ihnen GeeksforGeeks gefällt und Sie einen Beitrag leisten möchten, können Sie auch einen Artikel über Contribute.geeksforgeeks.org schreiben oder Ihren Artikel per E-Mail an Contribute@geeksforgeeks.org senden. Sehen Sie, wie Ihr Artikel auf der Hauptseite von GeeksforGeeks erscheint, und helfen Sie anderen Geeks.