> Java > java지도 시간 > Java의 `==` 연산자가 때때로 정수 객체 값을 비교하고 때로는 참조를 비교하는 이유는 무엇입니까?

Java의 `==` 연산자가 때때로 정수 객체 값을 비교하고 때로는 참조를 비교하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-24 02:28:14
원래의
185명이 탐색했습니다.

Why Does Java's `==` Operator Sometimes Compare Integer Object Values and Sometimes References?

Java의 놀라운 정수 박싱 동작

Java에서 Integer 객체는 기본 int 값에 대한 래퍼입니다. int를 Integer로 박싱할 때 일반적으로 == 연산자가 객체의 값을 비교할 것으로 예상합니다. 그러나 어떤 경우에는 == 연산자가 대신 개체의 참조를 비교합니다. 이 동작은 놀라운 결과로 이어질 수 있습니다.

다음 코드를 고려하세요.

public class Scratch {
    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
로그인 후 복사

첫 번째 출력은 예상한 대로입니다. : == 두 개의 서로 다른 Integer 객체의 참조를 비교합니다. 그러나 두 번째 결과는 놀랍습니다. c와 d가 동일한 값을 가질 때 ==가 true를 반환하는 이유는 무엇입니까?

답은 JLS(Java 언어 사양)에 있습니다. JLS의 섹션 5.1.7에 따르면:

boxing되는 값 p가 true, false, 바이트, u0000에서 u007f 범위의 char 또는 -128에서 127 사이의 int 또는 짧은 숫자인 경우 , r1과 r2를 p의 두 복싱 변환 결과로 둡니다. 항상 r1 == r2인 경우입니다.

이는 지정된 범위 내의 기본 값으로 생성된 Integer 객체가 동일한 참조를 갖는다는 것을 의미합니다. 우리의 경우 c와 d는 모두 동일한 int 값 100에서 생성되며 이는 -128에서 127 범위에 속합니다. 따라서 둘은 동일한 참조를 가지며 == 연산자는 true를 반환합니다.

출력의 두 번째 줄의 동작은 보장되지만 JLS는 출력의 첫 번째 줄의 동작이 보장되지 않는다고 제안합니다. 이론적으로 Java 구현에서는 성능 향상을 위해 공통 값에 대해 Integer 객체를 캐시할 수 있지만 JLS에서는 이 동작이 필요하지 않습니다. 결과적으로, 다양한 Java 구현에서는 이 경우를 다르게 처리할 수 있습니다.

위 내용은 Java의 `==` 연산자가 때때로 정수 객체 값을 비교하고 때로는 참조를 비교하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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