这来自Java Generics和Collections中的Sets部分。下面的示例用于说明如何计算String的哈希码:
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);
哈利为#34;红狐狸跳过篱笆"是1153233987386247098。
这似乎是正确的。但是,如果我使用简写符号,* =,我得到
0表示答案。
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);
哈利为#34;红狐狸跳过篱笆"是0
所以我很好奇如何使用* =来评估运算符优先级 操作
答案 0 :(得分:8)
hash *= 31 + ch;
与
相同hash = hash * (31 + ch);
解释了0结果,因为hash
被初始化为0并且在每次乘法后保持为0。
在评估*=
运算符之前,将评估其两个操作数(hash
和31+ch
)。只有这样它们才会相乘,结果存储在hash
变量中。
为了获得相同的
输出hash = hash * 31 + ch;
使用*=
,您必须打破操作:
hash *= 31;
hash += ch;