Я знаю, что здесь много ответов, но все они кажутся немного запутанными.Поэтому, проведя некоторое исследование из руководства по изучению Java-оракула, я пришел к трем различным сценариям, когда использовать && или &.Три сценария: логическое И , побитовое И и логическое И .
Логическое И: Логическое И (или условное AND) использует оператор && .Это короткозамкнутый смысл: если левый операнд имеет значение false, то правый операнд не будет оцениваться.
Пример:
int x = 0;
if (false && (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); // "0"
В приведенном выше примере значение, выводимое на консоль x, будет 0, поскольку первый операнд в операторе if равен false, следовательно, java не нужно вычислять (1== ++ x) поэтому x не будет вычисляться.
Побитовое И: Побитовое И использует оператор & .Используется для предварительной побитовой операции со значением.Гораздо проще увидеть, что происходит, посмотрев на операцию над двоичными числами, например:
int a = 5; // 5 in binary is 0101
int b = 12; // 12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4
Как вы можете видеть на примере, когда двоичные представления чисел 5 и 12 выстроены в ряд, тогдапоразрядное И предварительно сгенерирует только двоичное число, где одна и та же цифра в обоих числах имеет 1. Следовательно, 0101 & 1100 == 0100. Которое в десятичном числе 5 & 12 == 4.
Логическое И: Теперь логический оператор AND ведет себя аналогично и по-разному как для побитового И, так и для логического И.Мне нравится думать о нем как о предварительном формировании побитового И между двумя логическими значениями (или битами), поэтому он использует оператор & .Логические значения также могут быть результатом логического выражения.
Возвращает либо истинное, либо ложное значение, очень похожее на логическое И, но в отличие от логического И оно не закорочено.Причина в том, что для того, чтобы преформировать это побитовое И, он должен знать значение как левого, так и правого операнда.Вот пример:
int x = 0;
if (false & (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); //"1"
Теперь, когда этот оператор if выполняется, выражение (1 == ++ x) будет выполнено, даже если левый операнд имеет значение false.Следовательно, значение, распечатанное для x, будет равно 1, поскольку оно было увеличено.
Это также относится к логическому ИЛИ (||), побитовому ИЛИ (|) и логическому ИЛИ (|).