> Java > java지도 시간 > Java의 정수 박싱이 `==` 비교에 대해 때때로 `true`를 반환하고 때로는 `false`를 반환하는 이유는 무엇입니까?

Java의 정수 박싱이 `==` 비교에 대해 때때로 `true`를 반환하고 때로는 `false`를 반환하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-23 00:50:14
원래의
479명이 탐색했습니다.

Why Does Integer Boxing in Java Sometimes Return `true` and Sometimes `false` for `==` Comparisons?

Java에서 정수 박싱의 이상한 점 이해

Java에서 정수와 같은 기본 데이터 유형에는 정수와 같은 해당 래퍼 클래스가 있습니다. 객체 지향 기능을 제공합니다. 이러한 값을 boxing 및 unboxing하는 방법은 놀라운 결과로 이어질 수 있습니다.

다음 코드에서 이러한 관찰 결과가 나옵니다.

public class WeirdBoxing {
    public static void main(String[] args) {
        Integer a = 1000, b = 1000;
        System.out.println(a == b);
        
        Integer c = 100, d = 100;
        System.out.println(c == d);
    }
}
로그인 후 복사

실행되면 다음 코드가 인쇄됩니다.

false
true
로그인 후 복사

왜 첫 번째 비교는 false를 반환하고 두 번째 비교는 true를 반환합니까? == 연산자에 따르면 참조는 항상 비교되어야 합니다.

"진정한" 비교 뒤에 숨은 미스터리

흥미롭게도 진정한 비교는 요행이 아닙니다. JLS(Java 언어 사양) 섹션 5.1.7에서는 다음과 같이 설명합니다.

박스로 묶인 값 p가 [...] 정수 또는 -128에서 127 사이의 짧은 숫자인 경우 [...] r1 및 r2는 p의 두 복싱 변환 결과입니다. 항상 r1 == r2인 경우입니다.

이 경우 c와 d는 모두 지정된 범위 내의 값을 보유하므로 상자로 표시된 표현(정수 개체)이 동일해집니다.

비고정범위 비교의 모호성

반면, 첫 번째 비교는 (a == b)는 평등 보장 규칙에 속하지 않습니다. JLS는 다음과 같이 강조합니다.

다른 값의 경우 [규칙]은 프로그래머 측에서 상자 안에 있는 값의 동일성에 대한 어떠한 가정도 허용하지 않습니다.

기본적으로 고정 범위 밖의 값을 상자에 넣는 경우, 동일하다는 보장은 없습니다

결론

Java에서 Integer boxing의 이상한 동작은 효율성과 일반적인 사용 사례에 대한 언어 사양의 규정에서 비롯됩니다. 특정 범위 내의 값은 동일하게 boxing되는 것이 보장되지만, 다른 값의 경우 boxed 개체의 ID를 예측할 수 없습니다. 이러한 이해는 처음에 제시된 코드 조각에서 예시된 "이상함"을 조명합니다.

위 내용은 Java의 정수 박싱이 `==` 비교에 대해 때때로 `true`를 반환하고 때로는 `false`를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿