>  기사  >  Java  >  자바의 자동 박싱(automatic boxing)과 자동 언박싱(automatic unboxing)이 무엇인지 간략하게 설명해주세요.

자바의 자동 박싱(automatic boxing)과 자동 언박싱(automatic unboxing)이 무엇인지 간략하게 설명해주세요.

青灯夜游
青灯夜游앞으로
2018-10-19 17:43:022661검색

이 글의 내용은 자바의 자동 박싱과 자동 언박싱이 무엇인지 간략하게 이야기 해보려는 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

자동 언박싱 및 자동 박싱

Java는 각 기본 데이터 유형에 해당하는 래퍼 유형을 제공합니다. 예:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}

이 과정에서 해당 값에 따라 해당 Integer 개체가 자동으로 생성됩니다. 이것이 자동 박싱입니다. 다른 코드를 보세요:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}
이 과정에서 데이터는 래퍼 유형에 따라 기본 유형으로 자동 변환됩니다. 이것이 자동 언박싱입니다.

자동 박싱과 자동 언박싱의 원리도 아주 간단합니다. 명령줄 프로그램을 통해 CLASSPATH(즉, bin 디렉터리의 .class 파일이 있는 경로)를 입력하고 javap로 디컴파일한 후 생성된 바이트코드를 확인합니다.

디컴파일된 콘텐츠가 많아서 우리는 오직 다음에만 집중합니다. 핵심 부분:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: invokestatic  #16                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         4: astore_1
         5: aload_1
         6: invokevirtual #22                 // Method java/lang/Integer.intVal
ue:()I
         9: istore_2
        10: return

autoboxing 중에 Java 가상 머신이 자동 unboxing 중에 , Java 가상 머신이 Integer의 intValue 메소드를 자동으로 호출하는지 확인하세요. . 이것이 자동 개봉 및 자동 포장 원칙입니다. 널 포인터 예외에 주의하세요

다음과 같은 코드가 있습니다:

public static void main(String[] args) throws Exception
{
    Object obj = getObj(null);
    int i = (Integer)obj;
}
    
public static Object getObj(Object obj)
{
    return obj;
}
이 사용 시나리오는 매우 일반적입니다. 세션이나 요청에 int 값을 넣습니다. 위와 비슷한 장면이 됩니다. 따라서 자동 unboxing 중 null 포인터 예외에 주의하세요.

Little Trap

두 개의 코드를 살펴보세요. 첫 번째 코드는

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}
실행 결과는

true
false
두 번째 코드는

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;
        
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}
실행 결과는

false
false
입니다. 결과는 이렇습니다. 이유는 Byte, Short, Integer, Long, Char 복싱 클래스의 valueOf() 메서드가 128비트 구분선을 기준으로 캐시되므로 값이 128보다 작고 -128보다 크면 됩니다. Integer를 예로 들면, valueOf(int i)의 소스 코드는 다음과 같습니다.

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }
그러나 Float 및 Double은 캐시되지 않습니다. 이유도 매우 간단합니다. , char은 특정 범위 내에 있습니다. 정수의 개수는 제한되어 있지만 두 개의 부동 소수점 숫자 float 및 double은 그렇지 않습니다.

요약: 위 내용이 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다. 더 많은 관련 튜토리얼을 보려면

Java 비디오 튜토리얼

,

Java 개발 그래픽 튜토리얼, bootstrap 비디오 튜토리얼을 방문하세요!

위 내용은 자바의 자동 박싱(automatic boxing)과 자동 언박싱(automatic unboxing)이 무엇인지 간략하게 설명해주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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