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