每一个基本类型都有一个与之对应的类,这个类就称为对象包装器。 例如, Integer。 Long、Double、Float、Short、Byte、Character...
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE5.0开始提供的功能。
虽然为打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
autoboxing和unboxing
在Java中,所有要处理的东西几乎都是对象(Object)。然而基本(Primitive)数据类型不是对象,也就是int、double、boolean等定义的变量,以及在程序中直接写下的字面常量。
使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。 要使用打包类型(Wrapper Types)才能将基本数据类型包装为对象。
map接口中的put(k,v)方法中的v参数要求的是对象的,其一般用法:
范例1:
import java.util.*;
public class TestMap {public static void main(String args[]) {
Map m1 = new HashMap();
m1.put("one",new Integer(1));//v参数是整形对象对象
m1.put("two",new Integer(2));
m1.put("three",new Integer(3));
System.out.println(m1);
if(m1.containsKey("two")) {
int i = ((Integer)m1.get("two"))。intValue();//强制转换为整形对象在得出值
System.out.println(i);
}
}
}
在进行编译时,编译器再自动根据您写下的语句,判断是否进行自动装箱动作。在上例中integer参考的会是Integer类的实例。同样的动作可以适用于boolean、byte、short、char、long、float、double等基本数据类型,分别会使用对应的打包类型(WrapperTypes)Boolean、Byte、Short、Character、Long、Float或Double。下面直接使用自动装箱功能来改写范例1:
public class TestMap {
public static void main(String args[]) {
Map m1 = new HashMap();
m1.put("one", 1);//自动打包,注意与上面代码的区别
m1.put("two", 2);
m1.put("three", 3);
System.out.println(m1)
if(m1.containsKey("two")) {
int i = (Integer)m1.get("two");//自动解包
System.out.println(i);
}
}
}
从以上内容可以知道:
1、打包后的是对象
2、对象是在堆中,而不是在栈中
至于这么做的原因,主要还是要使得基本类型与对象操作的一致性。强制转换的存在,导致了泛型的出现。