Java中*=运算符的运算符优先级是多少?
这来自Java泛型和集合中关于集合的部分。以下示例说明如何计算字符串的哈希代码:Java中*=运算符的运算符优先级是多少?,java,operator-keyword,operator-precedence,Java,Operator Keyword,Operator Precedence,这来自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 ???? ha
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);
“红狐跳过篱笆”的哈希是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);
“红狐跳过篱笆”的哈希值为0
因此,我很好奇如何使用*=
接线员
hash *= 31 + ch;
与
hash = hash * (31 + ch);
这解释了0的结果,因为散列
被初始化为0,并且在每次乘法后保持为0
在计算*=
运算符之前,将计算其两个操作数(hash
和31+ch
)。只有当它们相乘时,结果才会存储在散列变量中
为了获得相同的输出
hash = hash * 31 + ch;
使用*=
,您必须中断以下操作:
hash *= 31;
hash += ch;
与
hash = hash * (31 + ch);
这解释了0的结果,因为散列
被初始化为0,并且在每次乘法后保持为0
在计算*=
运算符之前,将计算其两个操作数(hash
和31+ch
)。只有当它们相乘时,结果才会存储在散列变量中
为了获得相同的输出
hash = hash * 31 + ch;
使用*=
,您必须中断以下操作:
hash *= 31;
hash += ch;
. 这就是为什么它在乘法之前做加法,得到零。。这就是为什么它在乘法之前进行加法,得到零。或者,因为首先使用*=
最可能的原因是为了减少键入,所以只需使用hash=hash*31+ch
:-)@paxdiablo当然是这样:)您的答案非常清楚且符合逻辑。事实上,我认为情况就是这样。然而,我很好奇,实现者(java设计人员)是否真的正确,或者这是他们的一个错误?@geogecurington我相信,如果它的行为符合您的预期,就会令人困惑,因为您期望一个复数赋值运算符执行两个赋值-首先赋值乘法的结果,然后赋值加法的结果;这是我最后的评论。我的逻辑是这样的:或者,因为使用*=
的最可能的原因是为了减少键入,所以只需使用hash=hash*31+ch
:-)@paxdiablo当然是这样:)您的答案非常清楚且符合逻辑。事实上,我认为情况就是这样。然而,我很好奇,实现者(java设计人员)是否真的正确,或者这是他们的一个错误?@geogecurington我相信,如果它的行为符合您的预期,就会令人困惑,因为您期望一个复数赋值运算符执行两个赋值-首先赋值乘法的结果,然后赋值加法的结果;这是我最后的评论。我的逻辑如下: