# Equal-Methode überschreiben



## Swingman (13. Dezember 2004)

Hallo,
  ich versuche gerade die equals-Methode der Superklasse Object zu überschreiben, um  *alle *Referenztypen auf Inhaltsgleichheit überprüfen zu können. In der Literatur habe ich andeutungsweise gesehen, das es nicht gehen soll. Stimmt das? Und wenn ja, wie könnte es dann für bestimmte Referenztypen gemacht werden. Könnt ihr mir ein Bsp oder so zeigen D.h. muss für jeden erforderlichen Typ extra die equals-Methode überschreiben ?

  Danke für eure Hilfe


----------



## Snape (13. Dezember 2004)

Tach,
wieso soll das nicht gehen?


```
public class EqualsTest
{
  private String m_sName = "";
  private int m_iID = 0;
  
  public EqualsTest(int ID, String name)
  {
    m_sName = name;
    m_iID = ID;
  }
  
  public boolean equals(Object obj)
  {
    if ( (((EqualsTest)obj).m_sName.equals(m_sName))
        && (((EqualsTest)obj).m_iID == m_iID) ) 
        return true;
    return false;
  }
  public static void main( String[] args )
  {
    EqualsTest objectOne = new EqualsTest(1, "Hund");
    EqualsTest objectTwo = new EqualsTest(1, "Katze");
    EqualsTest objectThree = new EqualsTest(1, "Maus");
    EqualsTest objectFour = new EqualsTest(3, "Maus");
    EqualsTest objectFive = new EqualsTest(1, "Katze");
    
    System.out.println("objectOne equals objectTwo? -> " + objectOne.equals(objectTwo));
    System.out.println("objectOne equals objectThree? -> " + objectOne.equals(objectThree));
    System.out.println("objectThree equals objectFour? -> " + objectThree.equals(objectFour));
    System.out.println("objectTwo equals objectFive? -> " + objectTwo.equals(objectFive));
  }
}
```

Wofür die equals-Methode gut ist, kann man schön sehen, wenn man das Programm einmal startet, so wie es oben steht, und ein weiteres mal, wenn die equals-Methode auskommentiert ist.


----------



## RedWing (13. Dezember 2004)

Hallo,


			
				Snape hat gesagt.:
			
		

> Tach,
> wieso soll das nicht gehen?


Swingman meinte:


> ich versuche gerade die equals-Methode der Superklasse Object zu überschreiben, um *alle* Referenztypen auf Inhaltsgleichheit überprüfen zu können. In der Literatur habe ich andeutungsweise gesehen, das es nicht gehen soll.



Meines Erachtens ist das nicht möglich, wobei sich bei mir die nächste Frage daraus
Schlussfolgert:

Mich würde zu dem Thema intressieren wieso man die Methode überhaupt überschreiben
muss?

Kann mans nicht einfach so machen:

```
public boolean equals(EqualsTest test)
  {
    if ( (test.m_sName.equals(m_sName))
        && (test.m_iID == m_iID) ) 
        return true;
    return false;
  }
```
und sich somit das umständliche down gecaste sparen, wenn ich eh für jeden Typ die 
Methode neu Überschreiben muss.

Wo der Unterschied zwischen meiner und Snapes Variante ist, ist mir klar
aber kann mir mal jemand ein Beispiel verraten wo das Überschreiben der Methode equals
dem Überladen vorzuziehen ist, damit ich ein Sinn drin sehe?

Danke und Gruß

RedWing


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Ich denke zur Klärung dieser Problematik sind folgende Artikel ganz nützlich:
http://www.langer.camelot.de/Articles/JavaSpektrum/01.Equals-Part1/01.Equals1.html
http://www.langer.camelot.de/Articles/JavaSpektrum/02.Equals-Part2/02.Equals2.html
http://www.langer.camelot.de/Articles/JavaSpektrum/03.HashCode/03.HashCode.html

Gruß Tom


----------



## RedWing (16. Dezember 2004)

Scheint ja ne eigene Philosophie zu dem Thema zu geben..

Naja auf jeden Fall ne informative Quelle und nur weiterzuempfehlen...

Gruß

RedWing


----------



## wakoz (26. Februar 2011)

Warum Grabe ich dies aus?

Ich würde gern mehr über das Überschreiben von equals und Hashcode erfahren.

Warum man das macht ist klar, In Anwendungen die Verteilt ihre Daten vorhalten kann es mal passieren das Objekte an zwei verschiedenen stellen im Speicher liegen und somit ein false produzieren, obwohl sie identisch sind!



Leider sind die Links von Thomas nicht mehr Aktiv


----------



## Thomas Darimont (26. Februar 2011)

Hallo,

die oben genannten Artikel findet man jetzt hier:
http://www.angelikalanger.com/Articles/EffectiveJava/01.Equals-Part1/01.Equals1.html
http://www.angelikalanger.com/Articles/EffectiveJava/02.Equals-Part2/02.Equals2.html
http://www.angelikalanger.com/Articles/EffectiveJava/03.HashCode/03.HashCode.html

Gruß Tom


----------

