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");
이전 섹션에서 객체 조작의 편리성을 대략적으로 살펴봤고, 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)); } }
자동 박싱을 사용하는 방법은 다음과 같을 수도 있습니다.
int i = 10; Integer integer = i;
J2SE 5.0부터는 자동 boxing과 자동 unboxing이 가능합니다. 즉, 객체에 있는 기본 데이터 양식 정보를 자동으로 객체에서 빼냅니다. 예를 들어
Integer fooInteger = 10; int fooPrimitive = fooInteger;
Integer i = 10; System.out.println(i + 10); System.out.println(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中文网!