&と&&

C言語なら、&演算子と&&演算子の違いは明確です。&はビット演算、&&は論理演算。
でもJavaになると区別が曖昧になる。だって、Javaでは論理は1ビットの値として表されるから、論理型に関してはビット演算=論理演算になってしまうんです。そしたら、なぜ論理演算専用にわざわざ&&なんて用意してあるのか。頭の固いC使いのため?
実は、論理的な意味は同じでもコンパイラの挙動が決定的に違うのです。&&には評価のショートカットがあります。&&の左側がfalseだと、右側の式は評価もされません。右側の式がメソッド呼び出しを含んでいたとしても、そのメソッドは呼び出されません。
逆に&演算子の場合、左側がfalseであっても右側が評価されます。その上で真面目に論理演算がなされるのです。これは無駄なようでいて、そうでもありません。ショートカットに伴う条件分岐がないので、CPUのパイプライン処理が最大限に活躍でき、右側にメソッド呼び出しなどなければむしろ高速になることが期待できます。(未検証)
もちろん、ショートカットの副作用を避けたい場合にも有用ですね。