자동 포장 및 Unboxing 문제는 Java의 일반적인 문제입니다. 오늘 우리는 포장 및 Unboxing의 일부 문제를 살펴볼 것입니다. 이 기사는 먼저 포장 및 Unboxing에 대한 가장 기본적인 사항에 대해 이야기 한 다음 아래 서면 테스트에서 종종 발생하는 포장 및 Unboxing과 관련된 문제를 살펴 봅니다.
1. 포장이란 무엇입니까? Unboxing이란 무엇입니까?
이전 기사에서 Java는 각 기본 데이터 유형에 해당하는 래퍼 유형을 제공합니다. 각 기본 데이터 유형에 대해 래퍼 유형이 제공되는 이유는 여기에서 설명되지 않습니다. 관심있는 친구는 관련 정보를 참조 할 수 있습니다. Java SE5 이전에 값이 10 인 정수 객체를 생성하려면 다음을 수행해야합니다.
코드 사본은 다음과 같습니다.
정수 i = 새로운 정수 (10);
Java SE5이므로 자동 권투 기능이 제공됩니다. 값이 10 인 정수 객체를 생성하려면 다음을 수행하면됩니다.
코드 사본은 다음과 같습니다.
정수 i = 10;
이 과정에서 해당 정수 객체는 포장되는 숫자 값에 따라 자동으로 작성됩니다.
그렇다면 Unboxing이란 무엇입니까? 이름에서 알 수 있듯이 포장에 해당하며 래퍼 유형을 기본 데이터 유형으로 자동 변환합니다.
코드 사본은 다음과 같습니다.
정수 i = 10; //포장
int n = i; // Unbox
간단히 말해서, 포장은 기본 데이터 유형을 래퍼 유형으로 자동 변환하는 것을 의미합니다. Unboxing이란 래퍼 유형을 기본 데이터 유형으로 자동 변환하는 것을 의미합니다.
다음 표는 기본 데이터 유형에 해당하는 래퍼 유형입니다.
2. 포장 및 Unboxing은 어떻게 구현됩니까?
이전 섹션에서 포장의 기본 개념을 이해 한 후에는이 섹션에서는 포장 및 개봉이 구현되는 방법을 이해합니다.
Interger 클래스를 예로 들어 아래 코드를 보자.
public class main {public static void main (String [] args) {Integer i = 10; int n = i;}}클래스 파일을 디 컴파일하면 다음 컨텐츠가 나타납니다.
소집하여 얻은 바이트 코드 컨텐츠로부터, 포장시 (int) 정수의 값이 자동으로 호출된다는 것을 알 수 있습니다. 박스가 무너지면 Intvalue Integer 메소드가 자동으로 호출됩니다.
다른 것들은 이중이나 캐릭터와 같은 비슷합니다. 그것을 믿지 않는 친구들은 스스로 수동으로 시도 할 수 있습니다.
따라서 포장 및 개봉의 구현 프로세스는 한 문장으로 요약 될 수 있습니다.
권투 프로세스는 래퍼의 값의 값을 호출하여 구현되며, Unboxing 프로세스는 래퍼의 XXXValue 메소드를 호출하여 구현됩니다. (xxx는 해당 기본 데이터 유형을 나타냅니다).
3. 인터뷰 중 관련 질문
대부분의 사람들은 포장 및 개봉의 개념에 대해 분명하지만 인터뷰 및 필기 테스트 중에 포장 및 Unboxing에 대한 질문에 대답하지 못할 수도 있습니다. 아래는 포장/개봉과 관련된 몇 가지 일반적인 인터뷰 질문입니다.
1. 다음 코드의 출력 결과는 무엇입니까?
Public Class Main {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.out.out.println (i3 == i4);}} 어쩌면 어떤 친구들은 그들이 거짓을 출력 할 것이라고 말하거나 어떤 친구들은 그들이 사실을 출력 할 것이라고 말할 것입니다. 그러나 실제로 출력은 다음과 같습니다.
진실
거짓
그러한 결과가 발생하는 이유는 무엇입니까? 출력 결과는 i1과 i2가 동일한 객체를 가리키고 i3과 i4는 다른 객체를 가리 킵니다. 이 시점에서, 당신은 진실을 알기 위해 소스 코드 만 살펴보면됩니다. 다음 코드는 정수의 가치의 특정 구현입니다.
공개 정적 정수 가치 (int i) {if (i> = -128 && i <= integercache.high) return integercache.cache [i + 128]; Elsereturn New Inter (i);} IntegerCache 클래스의 구현은 다음과 같습니다.
개인 정적 클래스 integercache {정적 최종 INT High; 정적 최종 정수 캐시 []; 정적 {최종 int low = -128; // High 값은 propertyint h = 127에 의해 구성 될 수 있습니다. long.decode (integercachehighpropvalue) .intvalue (); i = math.max (i, 127); // 최대 배열 크기는 integer.max_valueh = math.min (i, integer.max_value --low); k <cache.length; k ++) 캐시 [k] = 새 정수 (j ++);} private integercache () {}} 이 두 코드에서, 값의 값을 통해 정수 객체를 생성 할 때 값이 [-128, 127] 사이 인 경우 integercache.cache에 이미 존재하는 객체에 대한 참조가 반환됩니다. 그렇지 않으면 새 정수 객체가 생성됩니다.
위의 코드에서 i1과 i2의 값은 100이므로 기존 객체는 캐시에서 직접 가져옵니다. 따라서 i1과 i2는 동일한 객체를 가리키고 i3과 i4는 각각 다른 객체를 가리 킵니다.
2. 다음 코드의 출력 결과는 무엇입니까?
Public Class Main {public static void main (String [] args) {double i1 = 100.0; double i2 = 100.0; double i3 = 200.0; double i4 = 200.0; system.out.println (i1 == i2); system.out.out.println (i3 == i4);}} 어쩌면 일부 친구들은 출력 결과가 위의 질문과 동일하다고 생각할 수도 있지만 실제로는 그렇지 않습니다. 실제 출력은 다음과 같습니다.
거짓
거짓
특정한 이유에 관해서는 독자가 더블 클래스의 가치 구현을 확인할 수 있습니다.
여기서는 이중 클래스의 가치가 정수 클래스의 가치와 다른 구현을 채택하는 이유에 대해서만 설명합니다. 매우 간단합니다. 특정 범위의 정수 값 수는 유한하지만 부동 소수점 수는 아닙니다.
정수, 짧은, 바이트, 문자 및 긴 가치의 가치의 구현은 비슷합니다.
이중 및 플로트의 가치의 구현은 유사합니다.
3. 다음 코드의 출력 결과는 무엇입니까?
public class main {public static void main (string [] args) {boolean i1 = false; boolean i2 = false; boolean i3 = true; boolean i4 = true; system.out.println (i1 == i2); System.out.out.out.println (i3 == i4);}} 출력 결과는 다음과 같습니다.
진실
진실
이것이 왜 결과인지에 관해서는 부울 클래스의 소스 코드를 읽은 후 한 눈에 분명하게 될 것입니다. 다음은 부울 방법의 특정 구현입니다.
공개 정적 부울 가치 (부울 b) {return (b? true : false);} 그리고 진실과 거짓은 무엇입니까? 2 개의 정적 부재 속성은 부울에 정의되어 있습니다.
공개 정적 최종 부울 true = 새로운 부울 (true);/** * <code> 부울 </code> 원시 * 값 <code> false> false </code>에 해당합니다. */public static final boolean false = 새로운 부울 (거짓);
이 시점에서 모든 사람은 위의 출력이 왜 사실인지 이해해야합니다.
4. 정수 i = 새로운 정수 (xxx)와 정수 i = xxx의 차이에 대해 이야기하십시오.
물론,이 주제는 비교적 광범위한 유형에 속합니다. 그러나 핵심 요점에 답변해야합니다. 다음 두 가지 차이점을 요약하겠습니다.
1) 첫 번째 방법은 자동 권투 프로세스를 트리거하지 않습니다. 두 번째 방법은 트리거됩니다.
2) 실행 효율 및 리소스 활용의 차이. 실행 효율성 및 리소스 사용법의 두 번째 방법은 일반적으로 첫 번째보다 낫습니다 (이것은 절대적이지 않음).
5. 다음 프로그램의 출력 결과는 무엇입니까?
공개 클래스 메인 {public static void main (String [] args) {정수 a = 1; 정수 b = 2; 정수 c = 3; 정수 d = 3; 정수 E = 321; 정수 f = 321; 긴 g = 3L; 긴 h = 2l; system.out.println (c == d); system.out.println (e == f); system.out.println (c == (a+b)); system.out.println (c.equals (a+b)); system.out.println (g == (a+b));}} (g.equals (a+h)); 먼저 출력 결과를 보지 마십시오. 독자는이 코드의 출력 결과에 대해 생각합니다. 여기서 주목해야 할 것은 "=="연산자의 두 피연산자가 래퍼 유형에 대한 참조 일 때 포인터가 동일한 객체인지 여부를 비교하고, 오페라 중 하나가 표현 (즉, 산술 작업을 포함 함)이면 수치 값을 비교합니다 (자동 미지급 프로세스를 트리거 할 수 있습니다). 또한 래퍼 유형의 경우 Equals 메소드가 유형 변환을 수행하지 않습니다. 이 두 지점을 이해 한 후 위의 출력 결과는 다음과 같습니다.
진실
거짓
진실
진실
진실
거짓
진실
첫 번째 및 두 번째 출력 결과에 대해서는 의심의 여지가 없습니다. 세 번째 문장에서 A+B에는 산술 작업이 포함되어 있으므로 자동 Unboxing 프로세스 (IntValue 메소드가 호출됨)를 트리거하므로 값이 동일한 지 비교합니다. C.equals (A+B)의 경우 자동 Unboxing 프로세스가 먼저 트리거되고 자동 패킹 프로세스가 트리거됩니다. 즉, A+B, 각각은 intvalue 메소드를 호출하고 추가 작업 후 값을 얻은 후 integer.valueof 메소드가 호출되고 이에 대한 비교가 수행됩니다. 다음과 같은 경우에도 마찬가지이지만 두 번째 ~ 마지막 출력 결과에주의를 기울입니다 (값이 int 유형 인 경우 복싱 프로세스는 integer.valueof; 유형이 길고 권투 메소드가 long.valueof를 호출합니다).
위의 것은 편집자가 소개 한 Java의 포장 및 Unboxing에 대한 깊은 이해입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!