2017-03-29 2 views
1

J'ai deux méthodes dans ma classe EmpSurchargé méthode equals et méthode putVal dans HashMap

class Emp 
{ 
    String empId; 
    public boolean equals(Emp e){..} 
    public boolean equals(Object o){..} 
    public int hashCode(){ 
    return empId.hashCode(); 
} 
} 

Maintenant, si je tente d'ajouter des objets Emp à un HashSet<Emp>.

Si je regarde le code de la méthode putVal de HashMap qui est utilisée pour comparer et mettre des valeurs à l'ensemble. Le code ne jette jamais votre objet passé à java.lang.Object. Donc à chaque fois que la version equals(Emp) devrait être appelée.

Mais chaque fois que equals(Object o) est appelé.Je veux savoir quand est-ce Emp est converti en java.lang.Object de sorte que everyTime le equals(Object o) est appelé.

est Ci-dessous l'extrait putval j'utilise:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 
         boolean evict) { 
    Node<K,V>[] tab; Node<K,V> p; int n, i; 
    if ((tab = table) == null || (n = tab.length) == 0) 
    n = (tab = resize()).length; 
    if ((p = tab[i = (n - 1) & hash]) == null) 
    tab[i] = newNode(hash, key, value, null); 
    else { 
    Node<K,V> e; K k; 
    if (p.hash == hash && 
      ((k = p.key) == key || (key != null && key.equals(k)))) 
     e = p; 
    else if (p instanceof TreeNode) 
     e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); 
        .... 
    } 
+0

L'autre chose à recommander ici: mieux vaut toujours utiliser des accolades pour les instructions then/else; même quand c'est juste une seule déclaration. Et: soyez précis sur le formatage/indentation; car cela aide vraiment à lire/comprendre le code! – GhostCat

Répondre

3

Le compilateur efface les paramètres de type générique, donc K et V se Object lorsque le code est compilé. Par conséquent, key.equals(k) exécute equals(Object o).

+0

Merci encore Eran. :) – ankit

2

Au-delà du bon argument d'Eran; le point est ne faites pas cela.

Ne pas surchargepublic boolean equals(Object)!

Il s'agit d'une méthode avec un contrat très défini et clair et connu en Java. Ajouter votre propre public equals(Emp)seulement augmente vos risques de créer des bugs.

Si c'est le cas, rendez cette méthode privée; et appelez-le à partir de la méthode equals(Object).

Vous voyez, la surcharge est un concept qui devrait être utilisé très attentivement, comme tout cela se produit à la compilation temps; et surtout en le combinant avec le polymorphisme, des choses inattendues peuvent arriver à l'exécution (comme vous venez de l'apprendre).

+0

Merci GhostCat .Points noté. – ankit