exemple - java map example



Pourquoi définir l'objet pour getEntry dans HashMap (3)

Je suis nouveau dans le domaine des médicaments génériques et je ne suis pas sûr que la réponse à ma question soit opinion based ou ait une véritable raison. Dans le code suivant qu'est-ce qui était nécessaire pour représenter une clé d'une entrée à un objet?

Object k;
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

Il semble être facilement remplacé par

if (e.hash == hash && (e.key == key || (key != null && key.equals(e.key))))

Plus de référence:

 final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

https://src-bin.com


Answer #1

Ceci est une mesure d'optimisation extrême qui n'est probablement pas nécessaire pour la pratique de programmation générale. Voici une discussion qui pourrait répondre à votre question. La déclaration ci-dessous est copiée à partir de ce post:

C'est un style de codage rendu populaire par Doug Lea. C'est une optimisation extrême qui n'est probablement pas nécessaire. vous pouvez vous attendre à ce que le JIT fasse les mêmes optimisations. (Vous pouvez essayer de vérifier le code machine vous-même!) Néanmoins, la copie aux locales produit le plus petit bytecode, et pour le code de bas niveau, il est agréable d'écrire du code qui est un peu plus proche de la machine.


Answer #2

En regardant le code pour l'entrée, la clé est "finale". Mon point de vue est que ce code crée une variable non finale à partir de la variable finale de sorte que les contraintes d'une variable finale n'empêchent pas le code suivant de s'exécuter. En dehors de cela, je suppose aussi que vous avez dit que les deux conditions "si" devraient être les mêmes.


Answer #3

Vous avez manqué la dernière partie de la case où la key est vérifiée pour l'égalité avec k , donc la suppression de l'assignation (k = e.key) va casser la dernière vérification -

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))





hashmap