>Java >Java시작하기 >Java의 자동 박싱 및 언박싱에 대한 심층적인 이해

Java의 자동 박싱 및 언박싱에 대한 심층적인 이해

王林
王林앞으로
2019-12-19 11:55:292935검색

Java의 자동 박싱 및 언박싱에 대한 심층적인 이해

1. Boxing은 무엇이고 Unboxing은 무엇인가요?

Boxing: 기본 데이터 유형을 패키징 클래스로 변환합니다.

Unboxing: 래퍼 클래스를 기본 데이터 유형으로 변환합니다.

기본 데이터 유형에 해당하는 래퍼 클래스:

int(몇 바이트 4) - Integer

byte(1) - Byte

short(2) - Short

long(8) - Long

float(4) ) - Float

double (8) - Double

char (2) - Character

boolean (undefine) - Boolean

무료 온라인 비디오 학습 튜토리얼 추천: java video tutorial

2. 먼저 manual boxing 및 manual unboxing을 살펴보세요

예: int 및 Integer를 예로 사용

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

수동 boxing은 valueOf를 통해 수행됩니다. = 오른쪽의 값이 왼쪽에 할당되고 3은 int 유형으로 할당됩니다. 왼쪽에 주어지면 Integer 래퍼 클래스가 됩니다.

수동 unboxing은 intValue()를 통해 이루어집니다. i1이 Integer에서 int

3으로 변경된 것을 코드를 통해 확인할 수 있습니다. 수동으로 읽어본 후 자동으로 언박싱하는 작업을 살펴보겠습니다

jdk1.5 이후에는 java가 자동으로 박싱 및 언박싱이 되었습니다. 위의 예를 들어보세요.

Manual:

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

Automatic

Integer i1=3;
int i2=i1;

기본적으로 자동으로 설치되고 언박싱됩니다.

4. 여러 질문을 통해 자동 박싱 및 언박싱에 대한 이해를 심화하세요

(1)

Integer a = 100;
int b = 100;
System.out.println(a==b);结果为 true

이유: a는 자동으로 unboxing하고 b와 비교하므로 사실입니다

(2)

Integer a = 100;
Integer b = 100;
System.out.println(a==b);//结果为true
Integer a = 200;
Integer b = 200;
System.out.println(a==b);//结果为false

흥미롭습니다. 이런 일이 발생했는데 왜 두 변수는 같고, 값만 다르고, 하나는 참이고 다른 하나는 거짓입니다.

이유: 이 경우 비교 기호 ==에 대해 이야기해야 합니다. == 비교의 메모리 주소는 new가 생성한 객체의 메모리 주소입니다. 새로운 것은 아니지만 사실 Integer a=200; 200 앞에는 기본적으로 new Integer가 오고 사용된 메모리 주소가 다릅니다 == 비교는 거짓인데 왜 100이 참인가요? 이는 Java의 상수 풀 때문입니다. Integer의 소스 코드를 클릭하면 살펴볼 수 있습니다.

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

-128과 127을 비교하면 객체가 새로운 것이 아니라 상수 풀에서 직접 가져오므로 100은 true이고 200은 이 범위를 초과한 다음 새로운 연산이 수행되므로 메모리 주소는 다르다.

(3)

Integer a = new Integer(100);
Integer b = 100;
System.out.println(a==b);
//结果为false

위의 100과 비슷합니다. 상수 풀에서 가져오세요. 왜 거짓인가요?

이유: new Integer(100)를 사용하는 이유는 상수 풀에서 100을 가져올 수 있지만 사용되는 두 메모리 주소가 다르기 때문입니다.

(4)

Integer a = 100;
Integer b= 100;
System.out.println(a == b);
//结果true
a = 200;
b = 200;
System.out.println(c == d);
//结果为false

이유: = 기호 오른쪽의 값은 왼쪽의 a와 b에 할당되어 있습니다. 200은 이미 상수 풀에 없습니다. 패키징 클래스에 할당되었습니다. 자동 박싱은 상수 풀에 없으므로 개체는 기본적으로 새 것이므로 결과는 false입니다.

더 많은 관련 기사와 튜토리얼을 보려면 다음을 방문하세요. Java 언어 소개

위 내용은 Java의 자동 박싱 및 언박싱에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제