Java Hashset.contient du (des) produit mystérieux résultat

Je n'ai pas l'habitude de code en Java, mais récemment, j'ai commencé à ne plus avoir le choix. Je pourrais avoir quelques malentendu majeur de comment utiliser correctement HashSet. Il pourrait donc être possible quelque chose que je fait est tout simplement faux. Cependant, je suis reconnaissant pour toute aide, vous pourriez offrir. Donc, le problème réel:

Dans un petit programme que j'écrivais, j'étais la génération très semblables objets, qui, lors de sa création, aurait très spécifiques id (un string ou dans ma dernière itération d'une long). Parce que chaque objet donnerait naissance à de nouveaux objets, je voulais filtrer tous ceux que j'ai déjà créé. J'ai donc commencé à jeter l'id de chaque nouvel objet dans mon Hash(Set) et d'essais avec HashSet.contains(), si un objet a été créé avant. Voici le code complet:

//hashtest.java
import java.util.HashSet;

class L {
    public long l;
    public L(long l) {
        this.l = l;
    }
    public int hashCode() {
        return (int)this.l;
    }
    public boolean equals(L other) {
        return (int)this.l == (int)other.l;
    }
}

class hashtest {
    public static void main(String args[]) {
        HashSet<L> hash = new HashSet<L>();
        L a = new L(2);
        L b = new L(2);
        hash.add(a);
        System.out.println(hash.contains(a));
        System.out.println(hash.contains(b));
        System.out.println(a.equals(b));
        System.out.println(a.hashCode() == b.hashCode());
    }
}

produit la sortie suivante:

true
false
true
true    

donc, apparemment, contains ne pas utiliser le equals fonction fournie par L, ou je présente une certaine incompréhension de la notion ...

Je l'ai testé avec openjdk (version actuelle inclus dans ubuntu) et la vigueur officielle de java d'Oracle sur Win7

pour l'exhaustivité officiel de java-documentation de l'api pour HashSet.contains():

public boolean contains(Object o)

Retourne true si cet ensemble contient les
l'élément spécifié. Plus formellement,
retourne true si et seulement si cet ensemble
contient un élément e tels que
(o==null ? e==null : o.equals(e)).

http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Objet)

Des idées ou des suggestions?

OriginalL'auteur Jochen | 2010-11-07