2010-10-29 8 views
3

J'ai créé un objet HashSet, et la valeur est un objet (Triple) qui est ma propre classe. Mais j'ai une chose étrange, quand il y a deux objets égaux sur mon HashSet, est-ce possible? Voici ma méthode redéfinie pour les égaux dans la classe TripleHashSet avec deux objets égaux?

@Override 
public boolean equals(Object other){ 
if (other == null) return false; 
if (other == this) return true; 
if (this.getClass() != other.getClass()) return false; 
Triple otherTriple = (Triple)other; 

if(otherTriple.getSubject().equals(getSubject()) && 
    otherTriple.getPredicate().equals(getPredicate()) && 
    otherTriple.getObject().equals(getObject())) 
    return true; 
return false; 

}

Répondre

1

J'ai du mal à comprendre votre question, mais hashCode() et equals() sematics sont importants que lorsque vous prévoyez d'utiliser un objet comme la clé. Et vous ne pouvez pas avoir deux objets évaluant le même hachage dans une carte ... l'un remplacera l'autre

+3

Les deux clés, keyA et keyB, peuvent avoir la même valeur de hachage sans se chevaucher l'une l'autre, sinon le concept global d'une table de hachage ne fonctionnerait pas. Ce n'est que lorsque keyA.equals (keyB) 'que le dernier ajouté écrasera le précédent. –

+0

désolé, c'est un hashSet, pas un hashMap, je viens de le réaliser ... – zfm

5

Vous devez être sûr de mettre en œuvre hashCode() aussi bien, et lorsque deux Triples sont égaux, leurs hashcodes doivent être égaux. Si vous ne faites pas cela, vous aurez un comportement étrange.

+0

@ user491748: ne fait pas de différence. –

+0

donc la valeur peut être égale? ok je vois ... merci – zfm

2

On dirait qu'il retourne vrai pour cordes que ... je tente d'exécuter le code ci-dessous

  final HashSet<Car> carHashSet = new HashSet<Car>(); 
    final Car c1 = new Car("black","ZX","deisel"); 
    final Car c2 = new Car("black","ZX","deisel"); 
    carHashSet.add(c1); 

    if (carHashSet.contains(c2)) 
     System.out.println("has c2 obj"); 
    else 
     System.out.println("dont have C2 obj"); 

    final HashSet<String> stringHashSet = new HashSet<String>(); 

    final String k1 = "test"; 
    final String k2 = "test";//final String k2 = "Test"; 

    stringHashSet.add(k1); 

    if (stringHashSet.contains(k2)) 
     System.out.println("has k2 obj"); 
    else 
     System.out.println("dont have k2 obj"); 

la sortie est comme ci-dessous:

C2 dont have obj a obj K2

quand je change k2 à la chaîne finale k2 = "Test" ;, la sortie est

ne pas C2 obj ne pas avoir k2 obj

+0

comparaison d'objet renvoie toujours faux sauf si la méthode égale est écrasée. comparaison de chaîne méthode égale ici évidemment retourner vrai. HashCode à générer. – vels4j