이상한 Java 정수 박싱
Java의 정수 박싱 메커니즘은 특히 참조 동등성을 비교할 때 약간 혼란스러울 수 있습니다.
문제
다음 코드 조각을 고려하세요.
실행하면 다음이 생성됩니다.
첫 번째 줄 a와 b가 다른 개체이므로 결과가 예상됩니다. 그런데 두 번째 줄의 결과는 무엇입니까?
답변
두 번째 줄의 실제 결과는 언어 사양에 의해 보장됩니다. 섹션 5.1.7에 따르면:
boxing할 값 p가 true, false, u0000~u007f 범위의 byte 또는 char이거나 -128~127 사이의 int 또는 short인 경우 모든 결과는 p, r1 및 r2의 두 복싱 변환은 항상 동일합니다.
두 번째 출력 줄은 보장되지만 첫 번째 줄은 보장되지 않습니다(아래 인용된 마지막 단락 참조).
이상적으로는 기본 값 p가 주어지면 Boxing은 항상 동일한 결과를 생성합니다. 참조. 실제로 이는 기존 구현 기술로는 불가능할 수도 있습니다. 위의 규칙은 실용적인 절충안입니다. 위의 마지막 절에서는 특정 공통 값을 항상 구별할 수 없는 개체로 묶어야 합니다. 구현에서는 느리게 또는 즉시 캐시할 수 있습니다.
다른 값의 경우 이 표현을 통해 프로그래머는 박스형 값의 동일성에 대해 어떤 가정도 할 수 없습니다. 이를 통해 이러한 참조의 일부 또는 전부를 공유할 수 있지만 강제하지는 않습니다.
이렇게 하면 대부분의 경우 특히 소형 장치에서 불필요한 성능 저하 없이 원하는 동작이 수행됩니다. 메모리 제약이 적은 구현에서는 -32K에서 32K 범위의 정수와 긴 문자뿐만 아니라 모든 문자와 짧은 문자를 캐시할 수 있습니다.
위 내용은 Java의 정수 박싱이 '정수 == 정수' 비교에 대해 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!