Überschreiben von equals und hashcode für Collection

Status
Nicht offen für weitere Antworten.

vogella

Bekanntes Mitglied
Hallo,

ich habe equals und hashcode in meiner Klasse überschreiben und in einer Collection einfach überprüfen zu können, ob ein Element schon in der Liste existiert. Allerdings werden die überschriebenen Methoden von equals und hashcode von der contains Methode der Collection nicht aufgerufen.

Weißt jemand, was ich falsch mache?

Ein einfaches Beispiel anbei.

Klasse name. Diese Klasse überschreibt equals (und hashcode). D.h. zwei Object sollten meiner Meinung nach gleich sein, wenn sie den selben Namen haben.
Code:
package testEquals;

public class Name {
    private String name;

    public void setName(String name) {
	this.name = name;
    }

    public String getName() {
	return name;
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object o) {
	System.out.println("Should be called!");
	if (o instanceof String) {
	    if (((String) o).equalsIgnoreCase(this.getName())) {
		return true;
	    }
	}
	return false;
    }

}

Test Program. Leider wird die equals methode von Name gar nicht aufgerufen, obwohl constains equals über die Method indexOf aufruft (im Java Standard Coding).



Code:
package testEquals;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
	ArrayList<Name> list = new ArrayList<Name>();
	Name person = new Name();
	person.setName("Lars");
	list.add(person);
	if (list.contains("Lars")) {
	    System.out.println("Super");
	} else
	    System.out.println("Schade");
    }
}

Viele Grüße, Lars
 
S

SlaterB

Gast
sehr wahrscheinlich wird die equals-Operation von "Lars" aufgerufen, von dem String,

und String.equals sagt: Name ist doof, bäh,


->
Suche mit einem neuen Name-Objekt mit dem Namen "Lars"


edit:

Code:
public int indexOf(Object elem) {
	if (elem == null) {
	    for (int i = 0; i < size; i++)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = 0; i < size; i++)
		if (----> elem.equals(elementData[i])  <-----)
		    return i;
	}
	return -1;
    }
 
B

Beni

Gast
"contains" ruft die equals-Methode von String auf (von dem Objekt, das der contains-Methode übergeben wurde).

Deine equals-Methode ist falsch implementiert. Ein String kann niemals dasselbe wie ein Name sein! Denn die Klassen müssen übereinstimmen. Schau mal in der API nach, wie die equals-Methode aussehen muss.
 

ms

Top Contributor
vogella hat gesagt.:
Code:
	if (list.contains("Lars")) {
	    System.out.println("Super");
	} else
	    System.out.println("Schade");

Nicht nur die equals-Methode ist falsch, sondern auch dein Testprogramm.
Du müsstest der contains-Methode richtigerweise ein Objekt vom Typ Person übergeben.
Dann sollte zumindest die equals-Methode aufgerufen werden.

Edit: seh gerade, dass das eh schon erwähnt wurde.
 
G

Guest

Gast
Gleiche Objekte müssen den selben Hashcode haben. Zwei Personen namens "Lars" und "lars" werden von Dir als gleich angesehen, haben aber nicht den selben Hashcode!

Mein Vorschlag:

Code:
    public int hashCode() {
	return name.hashCode();
    }

    public boolean equals(Object o) {
        return (o instanceof String) && ((String o).equals(name));
    }
}

Fred
 
S

SlaterB

Gast
oder Namen als toLowerCase() speichern + hashCode berechnen,

da andere Namen dann auch immer kleine Namen haben, könnte man wieder das normale equals nehmen,
oder den Namen normal speichern und nur für hashcode()-Berechnung toLowerCase()
 
B

Beni

Gast
Code:
    public boolean equals(Object o) {
        return (o instanceof String) && ((String o).equals(name));
    }
Nein

Code:
(o != null) &&
(o instanceof Name) &&
((o.name == null && name == null) || (o.name.equals( name )))
 

vogella

Bekanntes Mitglied
Hallo,

vielen Dank für die schnellen Antworten. Jetzt kann ich es korrekt anwenden.

Viele Grüße, Lars
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
T Überschreiben von Methoden Allgemeine Java-Themen 6
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
T Überschreiben von Methoden erzwingen Allgemeine Java-Themen 20
T Direktes Überschreiben Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
M Überschreiben? Allgemeine Java-Themen 3
A FileChooser Datei-Überschreiben Abfrage Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
P Strings: equals vs == Allgemeine Java-Themen 47
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
H Problem mit der .equals()-Methode Allgemeine Java-Themen 2
T Compiler-Fehler not equals Allgemeine Java-Themen 22
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
A mit .equals Array befüllen schlägt teilweise fehl Allgemeine Java-Themen 3
G Probleme mit equals Allgemeine Java-Themen 3
R Merkwürdiges Verhalten der equals Method Allgemeine Java-Themen 4
tuttle64 equals() und == Allgemeine Java-Themen 4
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
H double dispatch und equals(Object) Allgemeine Java-Themen 6
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
M equals & compareTo Allgemeine Java-Themen 15
M Warum Strings mit equals vergleichen... Allgemeine Java-Themen 6
T Wie intelligent ist dieses überschriebene .equals() ? Allgemeine Java-Themen 13
G Objektvergleich mit equals Allgemeine Java-Themen 5
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
André Uhres equals überschreiben Allgemeine Java-Themen 31
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Equals Methode überschreiben mit Array Allgemeine Java-Themen 2
M equals() != compareTo() ? Allgemeine Java-Themen 3
M String mit equals() vergleichen - Frage Allgemeine Java-Themen 3
S equals überladen Allgemeine Java-Themen 15
S Mal was allgemeines zu equals() Allgemeine Java-Themen 12
J Arrays vergleichen mit equals Allgemeine Java-Themen 8
T HashCode korrekt Allgemeine Java-Themen 7
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M hashCode() Allgemeine Java-Themen 3
A HashCode von DatagrammPacket(content) erzeugen. Allgemeine Java-Themen 3
N hashCode() für zwei ints Allgemeine Java-Themen 5
C hashCode() Allgemeine Java-Themen 2
hdi Wahrscheinlichkeitsfrage bei hashCode() mit modulo Allgemeine Java-Themen 7
Guybrush Threepwood HashCode-Generierung Allgemeine Java-Themen 4
G hashCode() == Speicheradresse? => warum nur int? Allgemeine Java-Themen 28
X hashCode() Berechnung Allgemeine Java-Themen 5
M hashCode Allgemeine Java-Themen 9
T hashCode() erzeugen. Allgemeine Java-Themen 11
T eine Frage zu hashCode() Allgemeine Java-Themen 11
U Hashtables und hashCode() Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben