[java] (i <= j && j <= i && i! = j)가 TRUE로 평가되는 이유는 무엇입니까?

무한 루프에서 실행되는 Java 코드를 작성했습니다.

다음은 코드입니다.

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

위의 코드에서 while루프 에서 조건을 확인하는 동안 처음에는 해당 프로그램이 while루프 내부로 들어 가지 않는 것처럼 보입니다 . 그러나 실제로는 무한 루프이며 값을 계속 인쇄합니다.

여기서 무슨 일이 일어나고 있습니까?



답변

  • i <= j로 평가된다 true자동 언 박싱은 INT 비교에 발생 후 모두 있기 때문에, i그리고 j기본값을 개최 0.

  • j <= itrue위의 이유 때문에 평가됩니다 .

  • i != jtrue둘 다 다른 객체 이기 때문에 로 평가됩니다 . 그리고 개체를 비교하는 동안 자동 언 박싱이 필요하지 않습니다.ij

모든 조건에 해당합니다, 당신은 변경되지 않습니다 ij는 무한히 실행되도록, 루프.


답변

당신이 비교하고 있기 때문에

  • 0 < = 0 (true) // unboxing

  • 0 > = 0 (true) // unboxing

  • reference != secondReference (true)원시 비교가 아닌 객체를 생성 할 때 따라서 while(true) { // Never ending loop }.


답변

정수 개체가 다릅니다. 기본 int 유형과 다릅니다.

이 답변을 참조하십시오 : Java에서 두 정수를 올바르게 비교하는 방법은 무엇입니까?

i != j부분은 사실이며, 당신은 거짓 일 것으로 예상했습니다.


답변

조건이 true이기 때문에 루프가 끝나지 않습니다 (i! = j는 true입니다. 2 개의 다른 객체가 있기 때문에 대신 Integer.valueOf 사용). 루프 내부에서 값이 변경되지 않으므로 조건이 영원히 참으로 유지됩니다.


답변

정수 개체가 다릅니다. 기본 int 유형과 다릅니다. 그렇게 할 수 있습니다. 당신이하는 일은 단지 대상을 비교하는 것이고 물론 그 결과는 사실입니다.


답변

먼저 이해해야 할 두 가지 경우가 있습니다.

사례 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);

사례 2 :

        Integer i = 10;
        Integer j = 10;

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

둘 다 다릅니다.

경우 1 : i!=jtrue모두가 힙에 두 개의 서로 다른 개체에 대한 참조 때문에 같을 수 없습니다. 그러나

사례 2 : i==jtrue모두 (10)는 정수 리터럴 및 Java는 유지하므로 pool for Integer literals값이있는 (-128 <= X <= 127). 따라서이 경우 10 <= 127 결과가 true이므로 둘 다 동일한 객체를 참조하게됩니다.


답변

아마도 그 이유는 ‘i’와 ‘j’가 모두 객체이고 객체 비교가 객체 참조 비교와 동일하지 않기 때문일 것입니다. i! = j 대신! i.equals (j) 사용을 고려하십시오.