2011-12-20 14 views
5

Digamos que tengo esto:¿Cómo trata Java con múltiples condiciones dentro de una única declaración IF

if(bool1 && bool2 && bool3) { 
... 
} 

ahora. ¿Es Java lo suficientemente inteligente como para omitir la comprobación de bool2 y bool2 si bool1 se evaluó como falso? ¿Java incluso los revisa de izquierda a derecha? Pregunto esto porque estaba "clasificando" las condiciones dentro de mi if por el tiempo que lleva hacerlo (empezando por las más baratas de la izquierda). Ahora no estoy seguro si esto me da algún beneficio de rendimiento porque no sé cómo maneja Java esto.

+0

Dado que intenta mejorar el rendimiento con estos cambios, ¿ha intentado medir el rendimiento antes y después de cambiar las condiciones? Por un lado, eso debería indicar si la lógica está en efecto en cortocircuito, como se explica a continuación, y, por otro, le dirá si la magnitud de estos cambios es significativa en la imagen más grande. – Douglas

Respuesta

19

Sí, Java (similar a otros idiomas principales) utiliza evaluación perezosa cortocircuitos que significa que evalúa lo menos posible.

Esto significa que el siguiente código es completamente seguro:

if(p != null && p.getAge() > 10) 

Además, a || b nunca se evalúa si ba evalúa a true.

+2

disculpa por desenterrar un hilo viejo, pero ¿por qué tienes "&& y"? ¿te refieres solo a "&&"? –

4

Sí, eso se llama cortocircuito.

favor, eche un vistazo a esta página de Wikipedia sobre short-circuiting

12

¿Es Java lo suficientemente inteligente como para omitir la comprobación de bool2 y bool2 si se evaluó bool1 como falso?

No se trata de ser inteligente, es un requisito especificado en el idioma. De lo contrario, no podría escribir expresiones como.

if(s != null && s.length() > 0) 

o

if(s == null || s.length() == 0) 

Por cierto si utiliza & y | siempre evaluará ambos lados de la expresión.

6

favor look up la diferencia entre & y && en Java (lo mismo se aplica a | y ||).

& y | son sólo operadores lógicos, mientras que && y || son condicionales operadores lógicos, que en su ejemplo significa que

if(bool1 && bool2 && bool3) { 

se saltará bool2 y bool3 si bool1 que es falso, y

if(bool1 & bool2 & bool3) { 

evaluará todas las condiciones, independientemente de sus valores.

Por ejemplo, teniendo en cuenta:

boolean foo() { 
    System.out.println("foo"); 
    return true; 
} 

if(foo() | foo()) imprimirá foodos veces, y if(foo() || foo()) - sólo una vez .

Cuestiones relacionadas