2010-11-24 7 views
-1
import java.util.*; 

public class HashingTest { 

// instance variables 

String name; 
int age; 
int hashCd; 
String gender; 

public HashingTest(String nm, int age, String gend) 
{ 
    name = nm; 
    this.age = age; 
    gender = gend; 
} 


public static void main(String[] args) { 

    HashingTest person1 = new HashingTest("Durvi",5,"Female"); 
    HashingTest person2 = new HashingTest("Pillu",5,"Female"); 
    HashingTest person3 = new HashingTest("Ninad",5,"Male"); 
    HashingTest person4 = new HashingTest("Varun",5,"Male"); 
    HashingTest person5 = new HashingTest("Sapna",5,"Female"); 
    HashingTest person6 = new HashingTest("Priya",5,"Female"); 

    //person2 and person1 are now referring to the same object 
    person2 = person1; 

    boolean truth = person1.equals(person2); 

    System.out.println(truth + " : Which means that if two object varaibles are refering the same object the equals() method returns true"); 

    Hashtable<HashingTest, String> hs = new Hashtable<HashingTest, String>(); 
    hs.put(person1, "Durvi"); 
    hs.put(person2, "Pillu"); 
    hs.put(person3, "Ninad"); 
    hs.put(person4, "Varun"); 

    String personVal = (String)hs.get(person1); 

    System.out.println(personVal); 

} 
} 

Sortie ::clé Hashtable va chercher la valeur incorrecte

vrai: Ce qui signifie que si deux varaibles d'objet sont référenceurs le même objet les égaux() méthode renvoie true Pillu

+1

Si vous exécutez ce programme à sec, j'imagine que la sortie est comme on s'y attendrait. Quelle est votre sortie attendue? –

Répondre

2

Cela fonctionne comme prévu. Ce que vous faites est la suivante:

person2 = person1; 

hs.put(person1, "Durvi"); 
hs.put(person2, "Pillu"); // since person1 == person2, 
          // this overwrites the previous key 

String personVal = (String)hs.get(person1); 

Depuis person2 == person1, le dernier appel est égal à

String personVal = (String)hs.get(person2); // person1 == person2 

Comme une note de côté, vous devez implémenter equals() et hashCode() pour votre classe HashingTest, jetez un oeil ici:

0

Vous obtenez correct comportement dans ce cas, mais ...

vous ne pouvez pas attendre ce que vous avez fait pour fonctionner correctement toujours parce que vous ne l'avez pas hashcode() et substituée equals().

Puisque vous faites une classe dont les instances sont utilisées comme clés dans un conteneur de hachage (comme HashSet, HashMap et HashTable), vous devez remplacer hashcode() et equals().

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

0

Par défaut, la méthode equals de java de Object compare les références. Puisque vous définissez les références comme étant identiques, alors l'appel à 'equals' retournera vrai. Si vous souhaitez modifier ce comportement, vous devez remplacer les égales pour vérifier les valeurs des champs (et tout ce dont vous avez besoin).

Faites juste attention quand vous faites cela - je vous suggère de lire sur ce que Josh Bloch avait à dire en Java efficace:

Item 8: Obey the general contract when overriding equals 
Item 9: Always override hashCode when you override equals 
0

que vous avez Voyant défini person1 et les variables PERSON2 soient les mêmes objet,

hs.put(person1, "Durvi"); 
    hs.put(person2, "Pillu"); 

est équivalent à

hs.put(person1, "Durvi"); 
    hs.put(person1, "Pillu"); 
+0

Merci ... Je viens de vérifier la taille de mon Hashtable ... ses 3 et non 4. Maintenant, j'ai compris qu'il a été remplacé! – NewQueries

0

Il faut comprendre que dans votre Hashtable vous avez utilisé la référence d'objet en tant que clé et la chaîne en tant que valeur.

Les deux person1 et des points PERSON2 au même objet dans la principale méthode qui est l'objet créé par

HashingTest("Durvi, 5, Female") 

hs.put(person1, "Durvi"); 
hs.put(person2, "Pillu"); 

La première déclaration de vente ci-dessus, crée une entrée avec la référence d'objet « Durvi » et attribue la valorisez "Durvi" pour cela.

Comme les clés de Hashtables ne peuvent pas être dupliquées, la deuxième ligne remplace la valeur "Durvi" créée par la ligne précédente avec "Pillu".

Ainsi, lorsque vous exécutez la méthode get

String personVal = (String)hs.get(person1); 
//returns the value "Pillu" which the key person1 now refers to in the hash table. 
System.out.println(personVal); //prints "Pillu" 

J'espère avoir clairement .. Reprenez si vous avez besoin d'autres éclaircissements ..

Ne pas manquer de remarquer que vous avez utilisé la référence d'objet à la place de "clé". J'espère que vous ne l'avez pas fait par erreur

+0

Merci Ragavan – NewQueries

Questions connexes