Попробуйте что-то вроде этого:
ul {
list-style-type: none;
padding: 0;
}
.page_item_has_children {
position: relative;
}
ul.children {
display: none;
position: absolute;
top: 100%;
left: 0;
padding: 0;
min-width: 200px; /* or whatever makes sense */
}
ul.children li {
height: 60px;
}
.page_item_has_children:hover > ul.children {
display: block;
}
Важным моментом здесь является то, что элемент 'page_item_has_children' относительно позиционируется и что дочерний элемент ul 'абсолютно позиционирован.
Нет, не будет оцениваться. И это очень полезно. Например, если вам нужно проверить, не является ли String не пустым или пустым, вы можете написать:
if (str != null && !str.isEmpty()) {
doSomethingWith(str.charAt(0));
}
или, наоборот,
if (str == null || str.isEmpty()) {
complainAboutUnusableString();
} else {
doSomethingWith(str.charAt(0));
}
Если бы у нас не было «коротких замыканий» в Java, мы бы получить много исключений NullPointerExceptions в приведенных выше строках кода.
No it will not be checked. This behaviour is called short-circuit evaluation and is a feature in many languages including Java.
Нет, если a истинно (в тесте или
), b не будет проверяться, так как результат теста всегда будет истинным, независимо от значения выражения b.
Сделайте простой тест:
if (true || ((String) null).equals("foobar")) {
...
}
не вызовет исключение NullPointerException
!
Все ответы здесь отличные, но просто для иллюстрации откуда это взялось, для подобных вопросов лучше обратиться к источнику: Спецификации языка Java.
Раздел 15:23, Оператор условного И (&&) , говорит:
Оператор && как & (§15.22.2), но вычисляет свой правый операнд, только если значение его левого операнда истинно. [...] Во время выполнения сначала оценивается выражение левого операнда [...], если результирующее значение ложно, значение условного выражения и выражения ложно, а выражение правого операнда не оценивается . Если значение левого операнда истинно, то вычисляется правое выражение [... ] результирующее значение становится значением условного выражения и. Таким образом, && вычисляет тот же результат, что и & для логических операндов. Он отличается только тем, что выражение правого операнда вычисляется условно, а не всегда.
И аналогично, Раздел 15:24, Оператор условного ИЛИ (||) , говорит:
|| оператор похож на | (§15.22.2), но оценивает свой правый операнд, только если значение его левого операнда ложно. [...] Во время выполнения сначала вычисляется выражение левого операнда; [...] если результирующее значение истинно, значение выражения условного ИЛИ истинно, а выражение правого операнда не оценивается. Если значение левого операнда ложно, то вычисляется правое выражение; [... ] результирующее значение становится значением выражения условного ИЛИ. Таким образом, || вычисляет тот же результат, что и | для логических или логических операндов. Он отличается только тем, что выражение правого операнда вычисляется условно, а не всегда.
Возможно, немного повторяется, но лучшее подтверждение того, как именно они работают. Аналогичным образом условный оператор (? :) оценивает только соответствующую «половину» (левая половина, если значение истинно, правая половина, если оно ложно), позволяя использовать такие выражения, как:
int x = (y == null) ? 0 : y.getFoo();
без исключения NullPointerException.
Да, оценка короткого замыкания для логических выражений является поведением по умолчанию для всего семейства C.
Интересным фактом является то, что Java также использует &
] и |
в качестве логических операндов (они перегружены, с типами int
они являются ожидаемыми побитовыми операциями) для оценки всех терминов в выражении, что также полезно, когда вам нужно побочные эффекты.
Нет, не будет, Java выполнит короткое замыкание и прекратит оценку, как только узнает результат.
В Java есть 5 различных логических операторов сравнения: &, &&, |, ||, ^
& и && являются операторами "и", | и || Операторы "или", ^ равно "xor"
Отдельные операторы будут проверять каждый параметр, независимо от значений, перед проверкой значений параметров.
Двойные сначала проверят левый параметр и его значение, и если истина
( ||
) или ложь
( &&
) оставит второй нетронутый.
Звук компилированный? Простой пример должен прояснить:
Дано для всех примеров:
String aString = null;
И:
if (aString != null & aString.equals("lala"))
Оба параметра проверяются перед выполнением оценки, и для второго параметра будет выбрано исключение NullPointerException.
if (aString != null && aString.equals("lala"))
Первый параметр проверяется и возвращает false
, поэтому второй параметр не будет проверяться, потому что результат в любом случае будет false
.
То же самое для OR:
if (aString == null | !aString.equals("lala"))
вызовет исключение NullPointerException тоже.
if (aString == null || !aString.equals("lala"))
Первый параметр проверяется, и он возвращает true
, поэтому второй параметр не будет проверяться, потому что результат в любом случае будет true
.
XOR может не подлежит оптимизации, поскольку зависит от обоих параметров.
Это восходит к основному различию между & и &&, | и ||
Кстати, вы выполняете одни и те же задачи много раз. Не уверен, что проблема в эффективности. Вы можете удалить часть дублирования.
Z z2 = partialHits.get(req_nr).get(z); // assuming a value cannout be null.
Z z3 = tmpmap.get(z); // assuming z3 cannot be null.
if(z2 == null || z2 < z3){
partialHits.get(z).put(z, z3);
}