La réponse à la question 2 est facile - oui, vous pouvez utiliser n'importe quel objet que vous aimez. Les mappes qui ont des clés de type chaîne sont largement utilisées car ce sont des structures de données typiques pour les services de nommage. Mais en général, vous pouvez mapper deux types comme Map<Car,Vendor>
ou Map<Student,Course>
.
Pour la méthode hashcode(), c'est comme avant - chaque fois que vous remplacez equals(), vous devez remplacer hashcode() pour obéir au contrat. D'un autre côté, si vous êtes satisfait de l'implémentation standard de equals(), vous ne devriez pas toucher hashcode() (car cela pourrait casser le contrat et aboutir à des hashcodes identiques pour les objets inégaux).
Note pratique: eclipse (et probablement d'autres IDE) peut générer automatiquement une paire d'implémentations de type equals() et hashcode() pour votre classe, basée uniquement sur les membres de la classe.
Modifier
Pour votre autre question: oui, exactement. Regardez le code source de HashMap.get (clé d'objet); il appelle la clé.hashcode pour calculer la position (bin) dans la table de hachage interne et renvoie la valeur à cette position (s'il y en a une). Mais attention aux méthodes hashcode/equals 'handmade' - si vous utilisez un objet comme clé, assurez-vous que le hashcode ne change pas par la suite, sinon vous ne trouverez plus les valeurs mappées. En d'autres termes, les champs que vous utilisez pour calculer l'égalité et le code hash doivent être définitifs (ou 'inchangeable' après la création de l'objet).
Supposons que nous ayons un contact avec String name
et String phonenumber
et que nous utilisions les deux champs pour calculer l'équation() et le hashcode(). Maintenant, nous créons "John Doe" avec son numéro de téléphone mobile et le mapper à son magasin de beignets préféré. hashcode() est utilisé pour calculer l'index (bin) dans la table de hachage et c'est là que le beignet est stocké.
Maintenant, nous apprenons qu'il a un nouveau numéro de téléphone et nous changeons le champ de numéro de téléphone de l'objet John Doe. Cela entraîne un nouveau code de hachage. Et ce hashcode se résout à un nouvel index de table de hachage - qui n'est généralement pas la position où la boutique Donut préférée de John Does a été stockée. Le problème est clair: dans ce cas, nous voulions faire correspondre "John Doe" à la boutique Donut, et non "John Doe avec un numéro de téléphone spécifique". Donc, nous devons être prudent avec equals/hashcode autogenerated pour s'assurer qu'ils sont ce que nous voulons vraiment, parce qu'ils pourraient utiliser des champs non désirés, introduisant des problèmes avec HashMaps et HashSets.
Edit 2
Si vous ajoutez un objet à un HashSet, l'objet est la clé de la table de hachage interne, la valeur est définie mais non utilisée (juste une instance statique de l'objet). Voici la mise en œuvre de l'openjdk 6 (b17):
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
"la valeur est définie mais inutilisée (juste une instance statique de l'objet)." Je ne comprends pas complètement..pls expliquer..Et deuxièmement dans HashSet si la valeur de l'obj est changée après les sorts .. le problème que vous avez mentionné pour HashMap (le code de hachage de la clé est changé, pas traçable) ne devrait pas arriver. . droite? confirmer ... – peakit
marquant cela comme fait .. très belle explication .. merci – peakit