& AMP; & AMP; (En) en || (Of) in als uitspraken

Ik heb de volgende code:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

Waar partialHitsis een hasjmap.
Wat zal er gebeuren als de eerste verklaring waar is? Will Java Controleer nog steeds de tweede verklaring? omdat de Hashmap in de eerste instructie niet mag bevatten De gegeven sleutel, dus als de tweede verklaring is aangevinkt, krijg ik NullPointerException.
Dus in eenvoudige woorden, als we de volgende code hebben

if(a && b)  
if(a || b)

Zou JAVA bcontroleren als aonjuist is in het eerste geval en als awaar is in het tweede geval?


Antwoord 1, Autoriteit 100%

Nee, het wordt niet geëvalueerd. En dit is erg handig. Als u bijvoorbeeld wilt testen of een string niet null of leeg is, kunt u schrijven:

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

of, andersom in de buurt

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

Als we geen ‘short-circuits’ in Java hadden, zouden we veel nullpointerexceptions ontvangen in de bovenstaande regels van de code.


Antwoord 2, Autoriteit 32%

Java heeft 5 verschillende Booleaanse vergelijkingsoperators: & amp ;, & amp; & amp;, |, ||, ^

& en && zijn “en”-operators, | en || “or” operatoren, ^ is “xor”

De enkele zullen elke parameter controleren, ongeacht de waarden, voordat ze de waarden van de parameters controleren.
De dubbele zullen eerst de linker parameter en zijn waarde controleren en of true(||) of false(&&) laat de tweede onaangeroerd.
Geluid ingewikkeld? Een eenvoudig voorbeeld zou het duidelijk moeten maken:

Gegeven voor alle voorbeelden:

String aString = null;

EN:

if (aString != null & aString.equals("lala"))

Beide parameters worden gecontroleerd voordat de evaluatie wordt uitgevoerd en er wordt een NullPointerException gegenereerd voor de tweede parameter.

if (aString != null && aString.equals("lala"))

De eerste parameter wordt gecontroleerd en retourneert false, dus de tweede parameter wordt niet gecontroleerd, omdat het resultaat toch falseis.

Hetzelfde voor OR:

if (aString == null | !aString.equals("lala"))

Zal ook NullPointerException verhogen.

if (aString == null || !aString.equals("lala"))

De eerste parameter is aangevinkt en retourneert true, dus de tweede parameter wordt niet gecontroleerd, omdat het resultaat toch trueis.

XOR kan niet worden geoptimaliseerd, omdat het van beide parameters afhangt.


Antwoord 3, autoriteit 12%

Nee, het wordt niet gecontroleerd. Dit gedrag wordt kortsluiting evaluatie en is een functie in vele talen, waaronder Java.


Antwoord 4, Autoriteit 9%

Alle antwoorden hier zijn geweldig, maar om te illustreren waar dit vandaan komt, voor vragen zoals deze is het goed om naar de bron te gaan: de Java-taalspecificatie.

sectie 15:23, voorwaardelijke en operator ( & AMP; & AMP;) , zegt:

De & AMP; & AMP; Operator is als & amp; (§15.22.2), maar evalueert zijn rechtse operand alleen als de waarde van zijn linker operand waar is. […] op looptijd wordt de linker operand-expressie eerst […] geëvalueerd als de resulterende waarde onjuist is, de waarde van de voorwaardelijke en expressie is onjuist en wordt de rechter operand-expressie niet geëvalueerd . Als de waarde van de linker operand waar is, wordt de rechteruitdrukking geëvalueerd […] de resulterende waarde wordt de waarde van de voorwaardelijke en expressie. Dus, & amp; & amp; berekent hetzelfde resultaat als & amp; op Boolean Operands. Het verschilt alleen omdat de rechter operand-expressie voorwaardelijk wordt geëvalueerd in plaats van altijd.

en op dezelfde manier, sectie 15:24, voorwaardelijk- Of operator (||) , zegt:

de || Operator is als | (§15.22.2), maar evalueert alleen de rechterhandoperand als de waarde van zijn linker operand onjuist is. […] op looptijd wordt de expressie van de linker operand eerst geëvalueerd; […] Als de resulterende waarde waar is, is de waarde van de voorwaardelijke of expressie waar en wordt de rechter operand-expressie niet geëvalueerd. Als de waarde van de linker operand onjuist is, wordt de rechteruitdrukking geëvalueerd; […] De resulterende waarde wordt de waarde van de voorwaardelijke of expressie. Dus, || berekent hetzelfde resultaat als | op Boolean of Boolean operanden. Het verschilt alleen omdat de rechter operand-expressie voorwaardelijk wordt geëvalueerd in plaats van altijd.

Een beetje repetitief, misschien, maar de beste bevestiging van precies hoe ze werken. Evenzo evalueert de voorwaardelijke operator (? 🙂 Evalueert alleen de juiste ‘half’ (linkerhelft als de waarde waar is, rechterhelft als het onjuist is), waardoor het gebruik van uitdrukkingen zoals:

int x = (y == null) ? 0 : y.getFoo();

zonder een nullpointerexception.


Antwoord 5, Autoriteit 4%

Kortsluiting hier betekent dat de tweede voorwaarde niet wordt geëvalueerd.

Als (A & AMP; & AMP; B) resulteert in kortsluiting als een fout is.

Als (A & AMP; & AMP; B) niet resulteert in kortsluiting als A waar is.

Als (a || b) resulteert in kortsluiting als A waar is.

Als (a || b) niet resulteert in kortsluiting als een fout is.


Antwoord 6, Autoriteit 3%

Nee, als A waar is (in een ortest), wordt B niet getest, omdat het resultaat van de test altijd waar is, wat is de waarde van de B-uitdrukking.

Maak een eenvoudige test:

if (true || ((String) null).equals("foobar")) {
    ...
}

zal geeneen NullPointerExceptiongooien!


Antwoord 7, autoriteit 2%

Nee, dat niet, Java zal kortsluiten en stoppen met evalueren zodra het het resultaat kent.


Antwoord 8, autoriteit 2%

Ja, de evaluatie van kortsluiting voor booleaanse uitdrukkingen is het standaardgedrag in de hele C-achtige familie.

Een interessant feit is dat Java ook de &en |gebruikt als logische operanden (ze zijn overbelast, met inttypen zijn ze de verwachte bitsgewijze bewerkingen) om alle termen in de uitdrukking te evalueren, wat ook handig is als u de bijwerkingen nodig heeft.


Antwoord 9

Dit gaat terug naar het fundamentele verschil tussen & en &&, | en ||

Trouwens, je voert dezelfde taken vaak uit. Ik weet niet zeker of efficiëntie een probleem is. Je zou een deel van de duplicatie kunnen verwijderen.

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);   
} 

Other episodes