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 중국어 웹사이트의 기타 관련 기사를 참조하세요!