java - ¿Por qué (i <= j && j <= i && i! = J) evalúan a TRUE?




5 Answers

Porque estás comparando

  • 0 < = 0 (true) // unboxing

  • 0 > = 0 (true) // unboxing

  • reference != secondReference (true) mientras crea objetos, no una comparación primitiva. Por lo tanto, se evalúa como while(true) { // Never ending loop } .

java

He escrito un fragmento de código Java que se ejecuta en un bucle infinito.

A continuación está el código:

public class TestProgram {
    public static void main(String[] args){
        Integer i = new Integer(0);
        Integer j = new Integer(0);

        while(i<=j && j<=i && i!=j){
            System.out.println(i);
        }
    }
}

En el código anterior, al ver la condición en el ciclo while, al principio parece que ese programa no entrará en el ciclo while. Pero en realidad es un ciclo infinito y sigue imprimiendo el valor.

¿Que está sucediendo aquí?




El ciclo no termina porque tu condición es verdadera (i! = J es verdadera porque hay 2 objetos diferentes, usa Integer.valueOf en su lugar) y dentro del ciclo los valores no cambian, por lo que tu condición permanece verdadera para siempre.




Hay dos casos diferentes que tenemos que entender primero,

caso 1:

        Integer i = new Integer(10);
        Integer j = new Integer(10);

        System.out.println((i<=j && j<=i && i!=j));
        System.out.println(i!=j);

caso 2:

        Integer i = 10;
        Integer j = 10;

        System.out.println((i<=j && j<=i && i==j));
        System.out.println(i==j);

ambos son diferentes, como

en el caso 1: i!=j será true porque ambos hacen referencia a dos objetos diferentes en el montón y no pueden ser iguales. Pero

en el caso 2: i==j será true porque ambos 10 son literales enteros y Java mantiene el pool for Integer literals que tienen valor (-128 <= X <= 127) . Entonces, en este caso 10 <= 127 resulta verdadero, entonces ambos tendrán referencia al mismo objeto.




El programa sigue mostrando el mismo valor de i porque no está incrementando o disminuyendo el valor de i o j . La condición en para siempre mantiene la evaluación en verdadero, por lo que es un ciclo infinito.




tienes que saber que es un poco diferente en && esto y esto y cuando usas && luego cuando la primera condición es verdadera, entonces verifica la segunda condición si es falsa, entonces no verifica la tercera condición porque en & operator si una condición es falsa todas las la declaración es falsa si se usa || entonces si se ve verdadero, entonces devuelve verdadero en tu código porque i y j son iguales; la primera y la segunda condición son verdaderas; en tercer condición, será falsa porque son iguales y la condición es falsa.






Related


Tags

java