==를 기본 및 boxed 값에 사용할 때, autoboxing 완료 또는 unboxing 완료
다음 코드가 컴파일됩니다 (Java 8 사용).
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
그러나 그것은 무엇을합니까?
Unbox i1
:
boolean compared = (i1.intvalue() == i2);
또는 상자 i2
:
boolean compared = (i1 == new Integer(i2));
그렇다면 두 Integer
객체 (참조 기준) 또는 두 int
변수를 값으로 비교합니까?
일부 숫자의 경우 Integer 클래스가 -128
to 사이의 값에 대한 내부 캐시를 유지하기 때문에 참조 비교가 올바른 결과를 생성합니다 127
(TheLostMind의 주석 참조). 이것이 1000
내가 예제에서 사용한 이유이며 비교 결과가 아니라 개봉 / 복싱에 대해 구체적으로 묻는 이유입니다.
JLS # 15.21.1에 정의되어 있습니다 .
등호 연산자의 피연산자가 모두 숫자 유형이거나 하나는 숫자 유형이고 다른 하나는 숫자 유형으로 변환 가능한 (§5.1.8) 피연산자에 대해 이진 숫자 승격이 수행됩니다 (§5.6.2).
그리고 JLS # 5.6.2 :
연산자가 이진 숫자 승격을 피연산자 쌍에 적용 할 때, 각 피연산자는 숫자 유형으로 변환 가능한 값을 나타내야하며 다음 규칙이 순서대로 적용됩니다.
- 피연산자가 참조 유형이면 unboxing 변환 [...]
따라서 귀하의 질문에 답하기 위해 Integer
는 int
.
몇 가지 예를 들어 보겠습니다.
사례 -1 :
public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
바이트 코드 :
....
16: if_icmpne 23 // comparing 2 integers
....
사례 -2 :
public static void main(String[] args) {
Integer i1 = 1000;
Integer i2 = 1000;
//int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
바이트 코드 :
...
16: if_acmpne 23 // comparing references
....
그래서, 비교의 경우 Integer
와 int
와 ==
는 Integer
에 언 박싱 int
후 비교 발생합니다.
2를 비교하는 경우 2 Integers
의 참조를 Integers
비교합니다.
설명
== 연산자를 사용하여 두 개의 기본 값을 비교할 때 자동 박싱이 발생하지 않습니다.
== 연산자를 사용하여 두 개체를 비교할 때 자동 박싱이 역할을합니다.
Object와 primitive type을 포함하는 혼합 조합을 사용하면 == operator unboxing을 사용하여 비교가 이루어지며 Object에서 unboxing이 발생하여 primitive type으로 변환됩니다.
아래 링크를 통해 적절한 예와 함께 자동 복싱에 대한 자세한 내용을 이해하는 데 도움이됩니다.
참조 링크 : http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html
'IT이야기' 카테고리의 다른 글
Angular 지시문 요소에 속성을 추가하는 방법 (0) | 2021.04.29 |
---|---|
스코프가 파괴 될 때 각도 $ watch를 제거 (0) | 2021.04.28 |
Bitbucket 저장소가 "원격 : 잘못된 암호 시도 횟수가 너무 많습니다. (0) | 2021.04.28 |
'@ angular / common / http'모듈을 찾을 수 없습니다. (0) | 2021.04.28 |
Qt 기반 프로젝트에서 애플리케이션 아이콘을 설정하는 방법 (0) | 2021.04.28 |