>  기사  >  Java  >  Java 자동 박싱 및 언박싱에 대한 심층 분석

Java 자동 박싱 및 언박싱에 대한 심층 분석

高洛峰
高洛峰원래의
2017-01-24 14:16:011491검색

jdk1.5 이후에 소개된 새로운 컨텐츠입니다. 퍼블리싱이 최고의 메모리라고 주장하기 때문에 블로그로 메모리를 교체하기로 결정했습니다.
Java 언어 사양에 따르면 패키징과 언패킹은 많은 경우에 있습니다. (이 경우 패키징을 박싱(boxing), 언패킹(unpacking)을 언박싱(unboxing)이라고 합니다.)
사실 제가 이해한 바에 따르면 자동 박싱은 기본 데이터 유형이 객체 유형으로 캡슐화되어 있다고 간단히 이해될 수 있습니다. Java의 객체 지향을 준수합니다. 예를 들어 int를 사용합니다.

//声明一个Integer对象 
Integer num = 10; 
//以上的声明就是用到了自动的装箱:解析为 
Integer num = new Integer(10);以上就是一个很好的体现,因为10是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明,这就是自动装箱的魅力 
自动将基本数据类型转化为对应的封装类型。成为一个对象以后就可以调用对象所声明的所有的方法 
自动拆箱:故名思议就是将对象重新转化为基本数据类型: 
//装箱 
Integer num = 10; 
//拆箱 
int num1 = num;自动拆箱有个很典型的用法就是在进行运算的时候:因为对象时不恩直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除 
Integer num = 10; 
//进行计算时隐含的有自动拆箱 
System.out.print(num--);哈哈 应该感觉很简单吧,下面我再来讲点稍微难点的, 
//在-128~127 之外的数 
Integer num1 = 297; Integer num2 = 297; 
System.out.println("num1==num2: "+(num1==num2)); 
// 在-128~127 之内的数 
Integer num3 = 97; Integer num4 = 97; 
System.out.println("num3==num4: "+(num3==num4)); 打印的结果是:num1==num2: false num3==num4: true

이상합니다. 이는 Java의 Integer 및 int 자동 박싱 및 언박싱 설계 때문이며 플라이웨이트 모드라고 합니다. )
간단한 숫자의 재사용을 늘리기 위해 Java에서는 다음과 같이 정의합니다. 자동 박싱 중에 –128에서 127까지의 값에 대해 박싱됩니다. Integer 객체가 된 후 메모리에 저장되고 항상 하나의 객체만 있습니다
-128에서 127 사이의 값을 초과하면 boxing된 Integer 객체는 재사용되지 않습니다. 이는 boxing할 때마다 새로운 Integer 객체가 생성되는 것과 동일합니다. ?
자동 박싱을 사용하지 않고 일반 클래스처럼 new를 사용하면 위 현상이 발생합니다. 인스턴스화는 new가 생성될 때마다 새로운 객체를 생성하게 됩니다. 자동 박싱 및 언박싱은 기본 데이터 유형뿐만 아니라 String 클래스에서도 사용됩니다. 예를 들어 문자열 객체를 자주 선언하는 경우:

String str = "sl"; 
//代替下面的声明方式 
String str = new String("sl");

기본 데이터(기본) 유형의 자동 박싱 및 언박싱은 함수입니다. J2SE 5.0부터 제공됩니다. 기본 데이터 유형을 패키징하는 데에는 편리함을 제공하지만, 세부적인 내용을 숨기기도 합니다. 기본 데이터 유형과 객체의 차이점을 구분할 수 있는 경우에만 사용하는 것이 좋습니다. 이전 섹션에서 객체 조작의 편리성을 대략적으로 살펴봤고, Java를 한동안 사용해 본 사람이라면 기본 데이터 유형을 객체로 변환해야 하는 경우가 있다는 것을 알고 있습니다. 예를 들어 Map 객체의 put() 메서드를 사용할 때 전달해야 하는 매개변수는 기본 데이터 유형이 아닌 객체입니다.
기본 데이터 유형을 객체로 래핑하려면 래퍼 유형(Wrapper Types)을 사용해야 합니다. 이전 섹션에서 J2SE 5.0 이전에는 int를 Integer 객체로 래핑하려면 다음 명령문을 사용해야 한다는 것을 이미 알고 있었습니다. 정수 = new Integer (10);
J2SE 5.0 이후에는 자동 박싱 기능이 제공됩니다. 다음 명령문을 사용하여 기본 데이터 유형을 직접 묶을 수 있습니다.
컴파일할 때 컴파일러는 자동으로 자동 박싱 동작을 수행할지 여부를 결정하는 명령문을 작성합니다. 위의 예에서 정수는 Integer 클래스의 인스턴스를 나타냅니다. boolean, byte, short, char, long, float, double 등과 같은 기본 데이터 유형과 해당 래퍼 유형(Wrapper Types) Boolean, Byte, Short, Character, Long, Float 또는 각각 Double이 사용됩니다. 예제 4.4를 다시 작성하기 위해 오토박싱 기능을 직접 사용해 보겠습니다.

예제 4.5 AutoBoxDemo.java
public class AutoBoxDemo { 
public static void main(String[] args) { 
Integer data1 = 10; 
Integer data2 = 20; 
// 转为double值再除以3 
System.out.println(data1.doubleValue() / 3); 
// 进行两个值的比较 
System.out.println(data1.compareTo(data2)); 
} 
}

프로그램은 훨씬 간단해 보입니다. data1과 data2는 런타임 시 Integer의 인스턴스이며 객체 작업을 직접 수행할 수 있습니다. 결과는 다음과 같습니다.
3.3333333333333335 –1

자동 박싱을 사용하는 방법은 다음과 같을 수도 있습니다.

int i = 10; 
Integer integer = i;

더 일반적인 java.lang.Number 클래스를 사용할 수도 있습니다. 자동으로 상자에 넣습니다. 예:
숫자 number = 3.14f;

3.14f는 먼저 자동으로 Float로 박싱된 후 number에 할당됩니다.

J2SE 5.0부터는 자동 boxing과 자동 unboxing이 가능합니다. 즉, 객체에 있는 기본 데이터 양식 정보를 자동으로 객체에서 빼냅니다. 예를 들어

Integer fooInteger = 10; 
int fooPrimitive = fooInteger;

fooInteger를 Integer로 자동 boxing된 인스턴스에 참조한 후 int형 변수 fooPrimitive에 대입하면 자동으로 int형이 되고, 그런 다음 fooPrimitive에 할당됩니다. 작동 중에 자동 박싱 및 언박싱도 수행할 수 있습니다. 예:
Integer i = 10; 
System.out.println(i + 10); 
System.out.println(i++);

위의 예에서는 20과 10이 표시됩니다. 컴파일러는 자동으로 박싱 및 언박싱을 수행합니다. 즉, 10이 먼저 박싱되고 i + 10이 되면 먼저 박싱이 해제됩니다. 추가 작업을 수행합니다. i++ 라인도 먼저 언박싱한 다음 증분 작업을 수행합니다. 또 다른 예를 살펴보겠습니다.

Boolean boo = true; 
System.out.println(boo && false);

同样的boo原来是Boolean的实例,在进行AND运算时,会先将boo拆箱,再与false进行AND运算,结果会显示false。 
////////////////////////////////////////////////////////////////// 
装箱:从基本类型转换成Object类型,称之为装箱;***拆箱:从Object转换乘基本类型的操作,称之为拆箱。 这个操作在反射过程中用的比较的多。 
装箱:在堆中建立一个Object实例,把你指定的值复制成去;***拆箱:判别引用指向的堆中信息是否是要拆成的类型,是取出堆中值送给栈中变量,否则报异常 
/////////////////////////////////////////////////////////////////// 
装箱是值类型到object类型或到该值类型所实现的任何接口类型的隐士转换。 
将一个值类型装箱会分配一个对象实例并将该值复制到新的对象中。 

int i=123; 
object o=i;

这句话的结果是在堆栈上创建一个对象o,而该对象在堆上引用int类型的值。该值是赋值给变量i 
的值类型值的一个副本。 
下面是显示执行装箱转换 

int i=123; 
ojbect o=(object)i;

此例将整数变量i通过装箱转换为对象o。这样,存储在变量i中的值就从123改为456。此例显示对象保留了内容的原始副本。即123。 
取消装箱是从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。取消装箱操作包括: 
检查对象实例,确保它是给定值类型的一个装箱值。 
将该值从实例复制到值类型变量中。 
例子: 

int i=123; 
object box=i; 
int j=(int)box;

更多java自动装箱拆箱深入剖析相关文章请关注PHP中文网!

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