이 기사는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!