Java中位运算代码逻辑相似为何index值不同?
为什么两次index赋值结果不同?
嘿,这个问题本质是Java表达式的求值顺序和运算符优先级在起作用,咱们拆开来一步步看:
首先先把你的代码格式化一下,方便理清逻辑:
String[] nodes = new String[3]; boolean in; int index = 0; int hash = "hi".hashCode(); // "hi"的hashCode是3329 // 第一个赋值场景 in = (nodes[(index = nodes.length - 1) & hash]) != null; System.out.println(index); // 输出2 // 第二个赋值场景 index = (nodes.length - 1) & hash; System.out.println(index); // 输出0
第一个场景:数组下标里的赋值+位运算
在表达式 nodes[(index = nodes.length - 1) & hash] 中,Java的求值规则是这样的:
- 先执行括号里的
index = nodes.length - 1:把nodes.length-1(也就是2)赋值给index,这个表达式的返回值是赋值后的index值(2)。 - 然后拿这个返回值(2)和
hash(3329)做位与运算:2 & 3329,结果是0(二进制里2是10,3329的二进制末尾两位是01,位与后是00)。 - 最后用这个位与结果(0)作为数组下标访问
nodes[0],但index已经被赋值成2了,所以后续打印index得到2。
第二个场景:先位运算再赋值
在表达式 index = (nodes.length - 1) & hash 中:
- 先计算括号里的位运算:
nodes.length-1(2)和hash(3329)做位与,结果是0。 - 然后把这个位运算的结果(0)赋值给index,所以打印index得到0。
简单来说,第一个场景里index = ...是先执行的,赋值完成后才做位运算;第二个场景是先做完位运算,再把结果赋值给index,这就是两次结果不同的核心原因!
内容的提问来源于stack exchange,提问作者ImJustACowLol
相关产品推荐
相关产品推荐

