2017-05-15 7 views
1

Ceci provient de la section sur les ensembles dans les génériques et collections Java. L'exemple suivant est donné pour illustrer comment calculer une hashcode pour cordes:Quelle est la priorité d'opérateur de l'opérateur * = dans Java?

int hash = 0; 
    String str = "The red fox jumped over the fence"; 
    /** calculate String Hashcode **/ 
    for (char ch: str.toCharArray()){ 
//  hash *= 31 + ch; this evaluates to 0 ???? 
     hash = hash * 31 + ch; 
    } 
    p("hash for " + str + " is " + hash); 

hachage pour « Le renard roux sauté par-dessus la clôture » est 1153233987386247098. Cela semble être correct. Cependant, si j'utilise la notation abrégée, * =, j'obtiens 0 pour la réponse.

int hash = 0; 
    String str = "The red fox jumped over the fence"; 
    /** calculate String Hashcode **/ 
    for (char ch: str.toCharArray()){ 
     hash *= 31 + ch; 
//  hash = hash * 31 + ch; 
    } 
    p("hash for " + str + " is " + hash); 

hachage pour « Le renard roux sauté par-dessus la clôture » est 0

Je suis curieux de savoir comment la priorité opérateur est évaluée à l'aide du * = opérateur ?

+1

[La priorité de '' * = (et toutes les autres missions opérateurs) est la même que pour '='] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html). C'est pourquoi il fait l'addition avant la multiplication et vous obtenez zéro. –

+0

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html –

Répondre

8
hash *= 31 + ch; 

est le même que

hash = hash * (31 + ch); 

ce qui explique le résultat 0, puisque hash est initialisé à 0 et reste 0 après chaque multiplication.

Avant d'évaluer l'opérateur *=, ses deux opérandes (hash et 31+ch) sont évalués. Seulement alors ils sont multipliés et le résultat est stocké dans la variable hash.

Afin d'obtenir la même sortie de

hash = hash * 31 + ch; 

utilisant *=, vous devrez briser les opérations:

hash *= 31; 
hash += ch; 
+0

Ou, puisque la raison la plus probable pour utiliser '* =' en premier lieu était de réduire la saisie, juste * use * ' hash = hash * 31 + ch' :-) – paxdiablo

+0

@paxdiablo C'est certainement vrai :) – Eran

+0

Votre réponse est très claire et logique. En fait, j'ai supposé que c'était le cas. Cependant, je suis curieux de savoir si c'est correct de la part des implémenteurs (concepteurs java) ou est-ce une erreur de leur part? –