所有的基本类型都有一个与之对应的类,通常,这些类称为包装器。这些包装器的对象拥有很鲜明的名字:Integer
Long Float Double Short Byte Character Void 和Boolean。这里除了八种基本数据类型意外,还有一个Void类,查看它的源码,其实很简单。文档描述这个类时,也说明他仅仅是为了配合反射的一个类。
public final class Void { /** * The {@code Class} object representing the pseudo-type corresponding to * the keyword {@code void}. */ @SuppressWarnings("unchecked") public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void"); /* * The Void class cannot be instantiated. */ private Void() {} }
对于一个ArrayList,声明时它的尖括号中类型参数不允许为基本类型 ,也就是只能声明成ArrayList<Integer>,当向其中添加元素时,将使用list.add(5)这样的方法,实际上它会自动的变为list.add(Integer.valueOf(5)),这种转变就是自动装箱。
相反地,当将一个Integer对象赋给一个int值时,将会自动拆箱。
int n=list.get(i);翻译成 int n=list.get(i).intValue();
甚至在算术表达式中也能够自动的封箱与拆箱。例如 Integer n=3;n++;编译器将自动插入一条对象拆箱的指令,然后进行自增操作,最后再将结果装箱。
在很多情况下,容易有一种假象,即基本类型与他们的对象包装器是一样的,只是他们的相等性不同。当使用==比较对象时,只不过检测他们是否指向同一个储存区域。因此,下面的比较通常不会成立:
Integer a=1000; Integer b=1000; return a==b;
当基本数据类型与其包装类型进行==判断时,会自动调用valueof方法进行拆箱,然后进行值的比较
Integer a=new Integer(1002); int b=1002; byte c=21; Byte d=new Byte((byte) 21); System.out.println(a==b); System.out.println(c==d);