Discussions Search    Reviews    Search Aid    Buzzzz    Google@Omgili Add to iGoogle   Bookmark and Share

  Advanced Search

HashSet spinnt!


On Thu, 3 Jul 2008 03:37:37 -0700 (PDT), willybrandt <...@gmx.de

Hallo d/c/l/j

In der javadoc von java.util.Set heißt es:
A collection that contains no duplicate elements. More formally, sets
contain no pair of elements e1 and e2 such that e1.equals(e2), and at
most one null element.

Soweit so gut. Jetzt habe ich hier ein kleines Testsnippet, das für
HashSet genau das Gegenteil beweist:
---CODE ON---
public class MyClass {
public static void main(String[] args) {
MyClass a = new MyClass();
MyClass b = new MyClass();

Set<MyClass myHashSet.add(a);
myHashSet.add(b);
System.out.println("myHashSet.size()="+myHashSet.size());
}

@Override
public boolean equals(Object obj) {
System.out.println("bin da!");
return true;
}
}
---CODE OFF---

Auf meiner Eclipse 3.3.1.1 Platform mit JRE 1.6.0_04 bekomme ich
myHashSet.size()=2
als Ausgabe. Laut javadoc müßte aber eigentlich
bin da!
myHashSet.size()=1
rauskommen... Was zur Hölle ist da los???

Gruß,
Alfred Schnabel




On Thu, 3 Jul 2008 04:03:39 -0700 (PDT), Paul Schwann <...@gmail.com

Hallo Alfred? Willi? Brand?,


Du hast dich nicht an die Konventionen gehalten. Wer equals
überschreibt muss auch hashCode korrekt implementieren.

Bevor ein HashSet die equals-Methode aufruft, wird erstmal der
Hashcode auf Gleichheit überprüft. Ist das der Fall, kommt equals zum
Zuge. Da Du hashCode nicht überschrrieben hast, werden die Werte a und
b als unterschiedlich angesehen (auf Grund der hashcode
implementierung der Basisklasse Object), equals interessiert gar nicht
mehr.

Die einfachste, korrekte aber vollkommen sinnlose Möglichkeit für
hashCode wäre:

public int hashCode() { return 0; }

Damit wird für jedes Element des Hashset ein Vergleich über equals
durchgeführt. Ich betone nochmals: Das sollt man nur zu testzwecken
machen, da die Performance des Hashset damit zusammenbricht.

Gruß,
Paul

On Thu, 3 Jul 2008 04:05:12 -0700 (PDT), Paul Schwann <...@gmail.com

Hallo nochmal,


In javadoc zu Object#equals heisst es u.a.:

"Note that it is generally necessary to override the hashCode method
whenever this method is overridden, so as to maintain the general
contract for the hashCode method, which states that equal objects must
have equal hash codes."

Gruß,
Paul

On Thu, 03 Jul 2008 13:06:32 +0200, Raffael Herzog <...@raffael.ch



Lies die JavaDocs nochmal, diesmal aber java.lang.Object, die Methoden
equals() und hashCode().

Kurz zusammengefasst: Man überschreibt niemals nur equals() alleine. Das
HashSet prüft zuerst den Rückgabewert von hashCode(), erst wenn die beiden
gleich sind, kommt equals() zum Zug.

Gruss,
Raffi

--
Come to think of it, there are already a million monkeys on a million
typewriters, and Usenet is *nothing* like Shakespeare!

herz...@raffael.ch · PGP Key 5D1FF5F4 · http://www.raffael.ch/

On Thu, 03 Jul 2008 12:59:55 +0200, Florian Weimer <...@deneb.enyo.de


HashSet setzt vorraus, daß die Objekte hashCode() und equals() korrekt
implementieren (u.a. a.equals(b) =das genau steht, weiß ich im Moment aber nicht.

On Thu, 3 Jul 2008 04:10:53 -0700 (PDT), willybrandt <...@gmx.de

Tatsache... hashCode() überschrieben und schon läuft's rund. Hätte ich
auch drauf kommen können...

Discussion Title: HashSet spinnt!
Title Keywords: HashSet  spinnt! 
 Latest discussions from this group  (de.comp.lang.java)
Überarbeitung von Collections in älteren Quellcodes  
[05 Oct 2008]
On Sun, 05 Oct 2008 20:00:43 +0200, Egon Schmid <egon.schmid@disc hingen.de Hallo! Wenn...
man sich so ältere Quellcodes, die unter Java 1.5 und älter geschrieben sind, bringt Eclipse...
Doc - files  
[04 Oct 2008]
On Sat, 4 Oct 2008 15:29:58 +0200, Reinhard Schüll <chickolino@hotma il.com Hallo NG, ...
wo (Download-Link) finde ich bitte die doc-files f Swing-Komponenten von jdk1.6.0_07? GruReinhard...
J2EE + Netbeans + Glassfish Deployment Probleme  
[02 Oct 2008]
On Thu, 2 Oct 2008 05:48:14 -0700 (PDT), Björn Sonntag <bjoern.sonntag@t -online.de Hallöchen...
NG, ich entwickel aktuell ein etwas grösseres Projekt mittels Netbeans und es soll...
More...