>Java >java지도 시간 >Java의 자동 언박싱에 대한 간략한 소개

Java의 자동 언박싱에 대한 간략한 소개

黄舟
黄舟원래의
2017-10-12 10:15:221253검색

이 기사는 주로 Java 자동 언박싱 관련 정보를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

면접 과정에서 면접관이 질문을 하면 항상 Java 언패킹을 묻는 경우가 많습니다. . 이 문제는 사실 어렵지는 않지만, 자율학습을 할 때 주의를 기울이지 않으면 헷갈릴 수 있으니, 저자가 이 문제에 대해 몇 가지 요약을 만들어 함께 홍보해보겠습니다!

1. 언박싱(Unboxing)의 개념

언박싱(unboxing)이란 JDK1.5 이후 자바의 기본타입과 참조타입 간의 상호변환을 의미한다.

1.1 Unboxing

Unboxing은 Long, Integer, Double, Float 등 해당 참조 유형을 기본 데이터 유형의 첫 글자를 대문자로 변환하는 작업을 Unboxing이라고 합니다.

1.2 Boxing

Boxing은 byte, int, short, long, double, float, boolean, char을 의미합니다. 이러한 Java 기본 데이터 유형은 데이터 유형을 정의할 때 해당 참조 유형으로 선언되지 않습니다. 처리 중인 참조 유형에 대한 복싱을 박싱이라고 합니다.

2. unboxing 관련 응용

JDK1.5 이후에는 기본형과 참조형을 변환하면 편리합니다.


package com.hzp.CZX;
/**
 * 测试拆装箱
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestDemo {
  /**
   * 拆装箱JDK1.5后
   */
  public static void first(){
    Integer i=7;//基本类型-->引用类型
    int j=i;//引用类型-->基本类型
    System.out.println(j);
  }
  /**
   * 拆装箱JDK1.4
   */
  public static void second(){
    Integer i=new Integer(78);
    int j=i.intValue();
    System.out.println(j);
  }
  /**
   * 测试方法
   * @param args
   */
  public static void main(String[] args) {
    first();
    second();
  }
}

위에서 unboxing에 대해 소개합니다. , 그러나 분해 상자를 사용할 때 주의해야 할 몇 가지 사항이 아래에 요약되어 있습니다.

3.Notes

먼저 다음과 같이 코드를 게시합니다.


package com.ygh.CZX;
/**
 * 关于java的拆装箱范围剖析
 * @author 夜孤寒
 * @version 1.1.1
 */
public class Test {
  /**
   * 以Integer类型为例
   */
  public static void first(){
    Integer i=new Integer(124);
    Integer j=new Integer(124);
    System.out.println(i==j);//false
    Integer a1=-128;
    Integer a2=-128;
    System.out.println(a1==a2);//true
    Integer b1=-129;
    Integer b2=-129;
    System.out.println(b1==b2);//false
    Integer c1=127;
    Integer c2=127;
    System.out.println(c1==c2);//true
    Integer d1=128;
    Integer d2=128;
    System.out.println(d1==d2);//false
  }
  public static void main(String[] args) {
    first();
    
  }
}

간단한 설명:

첫 번째 결과가 거짓인 이유는 서로 다른 개체가 생성되었기 때문입니다. ;

그런데 두 번째와 세 번째 결과는 왜 다른 걸까요?

이 문제를 소스 코드 관점에서 분석하기 위해 Integer 클래스의 소스 코드를 아래에 게시합니다.


  /**
   * Returns an {@code Integer} instance representing the specified
   * {@code int} value. If a new {@code Integer} instance is not
   * required, this method should generally be used in preference to
   * the constructor {@link #Integer(int)}, as this method is likely
   * to yield significantly better space and time performance by
   * caching frequently requested values.
   *
   * This method will always cache values in the range -128 to 127,
   * inclusive, and may cache other values outside of this range.
   *
   * @param i an {@code int} value.
   * @return an {@code Integer} instance representing {@code i}.
   * @since 1.5
   */
  public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
  }

위 코드는 자동으로 상자를 풀고 상자를 풀 때 범위가 있음을 의미합니다. 이 범위는 동일한 객체를 가리키지 않고 새로 생성된 객체를 반환합니다. 이 범위는 Integer 클래스의 내부 비공개 클래스인 IntegerCache에 반영될 수 있습니다.


 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;
    }

    private IntegerCache() {}
  }

여기에서 Out을 볼 수 있으며 범위 값은 [-128,127] 사이입니다.

Integer, Short, Byte, Character 및 Long 클래스의 valueOf 메서드 구현은 유사합니다.
Double과 Float의 valueOf 메소드 구현은 비슷합니다.

요약: 자동 언박싱을 위한 기본 유형의 범위는 다음과 같습니다.

1. 부울 유형 값 ​​

2. 모든 바이트 값 ​​

3. -128~127

4. -128~127 사이의 int 유형 값

5. u0000~u00ff

char 유형의 값은 double과 float가 다르며, double을 예로 사용하여 코드 토론을 게시합니다.


package com.ygh.CZX;

/**
 * 关于java的拆装箱范围剖析
 * 
 * @author 夜孤寒
 * @version 1.1.1
 */
public class Test {
  /**
   * Double
   */
  public static void first() {
    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;
    System.out.println(i1 == i2);//false
    System.out.println(i3 == i4);//false
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    first();
  }
}

위 코드의 출력 결과가 왜 모두 거짓인지 주목하세요? 마찬가지로 Double 클래스의 valueOf 메서드를 사용하여 논의합니다. 소스 코드를 게시하면 다음과 같이 명확해집니다.


  /**
   * Returns a {@code Double} instance representing the specified
   * {@code double} value.
   * If a new {@code Double} instance is not required, this method
   * should generally be used in preference to the constructor
   * {@link #Double(double)}, as this method is likely to yield
   * significantly better space and time performance by caching
   * frequently requested values.
   *
   * @param d a double value.
   * @return a {@code Double} instance representing {@code d}.
   * @since 1.5
   */
  public static Double valueOf(double d) {
    return new Double(d);
  }

즉, double 값의 범위에 관계없이 반환됩니다. 당신에게 새로운 물건. float는 double과 동일하므로 자세히 설명하지 않겠습니다.

위 내용은 작성자의 포장 풀기 상자 배치입니다. 독자들의 의견이 다른 경우 댓글 영역에 게시하면 작성자가 수정합니다!

위 내용은 Java의 자동 언박싱에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.