Daniel Thoma: Vergleich von Objekten

Beitrag lesen

Hallo lina,

Die contains() Methode bezieht sich immer auf Objekt-Gleichheit, verwendet also equals, compareTo oder einen angegebenen Comparator (je nach Implementierung).
Ausnahmen sind einige wenige Implementierungen, bei denen explizit angegeben ist, dass sie Objekt-Identität also == verwenden.

Was Du tun musst, und wohl nicht getan hast, ist equals zu überschreiben. Dies musst Du auch dann tun, wenn Du Comparable implementierst. Die Spezifikation von Comparable verlangt sogar explizit, dass o1.compareTo(o2) == 0 genau dann wenn o1.equals(o2).
Der Vector wird equals verwenden, er muss ja nur vergleichen und braucht keine Ordnung der Objekte. Daher funktioniert das auch nicht so, wie Du es erwartest.

Der zweite Punkt ist, dass Comparable eine Ordnung auf den Objekten definieren muss, d.h. es muss unter anderem gelten: o1.compareTo(o2) > 0 genau dann wenn, o2.compareTo(o1) < 0. Deine Implementierung gibt aber immer 1 zurück, wenn zwei Objekte verschieden sind und verletzt somit die Spezifikation.
Wenn Du solche Objekte z.B. sortieren lässt, terminiert der Sortieralgorithmus vermutlich nicht einmal mehr.

Ich denke, Du willst nur auf Gleichheit testen und keine Ordnung definieren. In dem Fall reicht es völlig, equals zu überschreiben.
Es ist zu beachten, dass Du dann auch hashCode überschreiben musst, da dessen Spezifikation logischerweise verlangt o1.equals(o2) impliziert o1.hashCode() == o2.hashCode(). Wenn Du solche Objekte z.B. in eine Hashtabelle packst, kommt es sonst zu komischen Effekten.

Die Verwendung einer Hashtabelle würde sich übrigens anbieten, um zu prüfen, ob ein gleiches Objekt schon einmal vorkam. Die contains()-Methode einer unsortierten Liste muss ja immer die komplette Liste durchlaufen. Da Du das für jedes Objekt, dass Du hinzufügst machst, läuft das auf ein O(n²)-Verfahren hinaus, was natürlich ungünstig ist, wenn es mehr als eine Hand voll Objekte sind.

Grüße

Daniel