무한 루프에서 실행되는 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 <= i
true
위의 이유 때문에 평가됩니다 . -
i != j
및true
둘 다 다른 객체 이기 때문에 로 평가됩니다 . 그리고 개체를 비교하는 동안 자동 언 박싱이 필요하지 않습니다.i
j
모든 조건에 해당합니다, 당신은 변경되지 않습니다 i
와 j
는 무한히 실행되도록, 루프.
답변
당신이 비교하고 있기 때문에
-
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!=j
것 true
모두가 힙에 두 개의 서로 다른 개체에 대한 참조 때문에 같을 수 없습니다. 그러나
사례 2 : i==j
것 true
모두 (10)는 정수 리터럴 및 Java는 유지하므로 pool for Integer literals
값이있는 (-128 <= X <= 127)
. 따라서이 경우 10 <= 127 결과가 true이므로 둘 다 동일한 객체를 참조하게됩니다.
답변
아마도 그 이유는 ‘i’와 ‘j’가 모두 객체이고 객체 비교가 객체 참조 비교와 동일하지 않기 때문일 것입니다. i! = j 대신! i.equals (j) 사용을 고려하십시오.
