IT이야기

==를 기본 및 boxed 값에 사용할 때, autoboxing 완료 또는 unboxing 완료

cyworld 2021. 4. 28. 20:34
반응형

==를 기본 및 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 클래스가 -128to 사이의 값에 대한 내부 캐시를 유지하기 때문에 참조 비교가 올바른 결과를 생성합니다 127(TheLostMind의 주석 참조). 이것이 1000내가 예제에서 사용한 이유이며 비교 결과가 아니라 개봉 / 복싱에 대해 구체적으로 묻는 이유입니다.


JLS # 15.21.1에 정의되어 있습니다 .

등호 연산자의 피연산자가 모두 숫자 유형이거나 하나는 숫자 유형이고 다른 하나는 숫자 유형으로 변환 가능한 (§5.1.8) 피연산자에 대해 이진 숫자 승격이 수행됩니다 (§5.6.2).

그리고 JLS # 5.6.2 :

연산자가 이진 숫자 승격을 피연산자 쌍에 적용 할 때, 각 피연산자는 숫자 유형으로 변환 가능한 값을 나타내야하며 다음 규칙이 순서대로 적용됩니다.

  • 피연산자가 참조 유형이면 unboxing 변환 [...]

따라서 귀하의 질문에 답하기 위해 Integerint.


몇 가지 예를 들어 보겠습니다.

사례 -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
....

그래서, 비교의 경우 Integerint==Integer에 언 박싱 int후 비교 발생합니다.

2를 비교하는 경우 2 Integers의 참조를 Integers비교합니다.


설명

  1. == 연산자를 사용하여 두 개의 기본 값을 비교할 때 자동 박싱이 발생하지 않습니다.

  2. == 연산자를 사용하여 두 개체를 비교할 때 자동 박싱이 역할을합니다.

  3. Object와 primitive type을 포함하는 혼합 조합을 사용하면 == operator unboxing을 사용하여 비교가 이루어지며 Object에서 unboxing이 발생하여 primitive type으로 변환됩니다.

아래 링크를 통해 적절한 예와 함께 자동 복싱에 대한 자세한 내용을 이해하는 데 도움이됩니다.

참조 링크 : http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html

참조 URL : https://stackoverflow.com/questions/30454635/when-using-for-a-primitive-and-a-boxed-value-is-autoboxing-done-or-is-unbox

반응형