Answers:
从Java语言规范-15.26.2复合赋值运算符。
形式的复合赋值表达式
E1 op= E2等效于E1 = (T)((E1) op (E2)),其中T是的类型E1,不同之处在于该表达式E1仅被评估一次。
所以a &= b;等于a = a & b;。
(在某些用法中,类型转换对结果有所影响,但在这种b情况下必须如此boolean,而类型转换则不执行任何操作。)
并且,根据记录,a &&= b;无效的Java。没有&&=操作员。
实际上,a = a & b;和之间的语义差异很小a = a && b;。(如果b是变量或常量,则两个版本的结果都将相同。当b子表达式具有副作用时,只有语义上的差异。在这种&情况下,副作用总是会发生。&&是否发生取决于的值a。)
在性能方面,需要在评估b成本,测试成本和价值分支之间进行权衡a,并可能避免避免不必要地分配给a。这种分析并非直截了当,但除非计算成本b不平凡,否则两个版本之间的性能差异将太小,不值得考虑。
参见JLS的15.22.2。对于布尔操作数,&运算符为布尔值,而不是按位。&&和&布尔操作数之间的唯一区别是,因为&&它是短路的(这意味着如果第一个操作数的计算结果为false,则不会计算第二个操作数)。
所以你的情况,如果b是一种原始的,a = a && b,a = a & b,和a &= b所有做同样的事情。
我遇到了使用布尔值的类似情况,我想避免在a已经为假的情况下调用b()。
这对我有用:
a &= a && b()
a=a&&b()。