D对象包装器与自动装箱 基本数据类型的equals与==

所有的基本类型都有一个与之对应的类,通常,这些类称为包装器。这些包装器的对象拥有很鲜明的名字: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;

然而,在Java中, 它们可能是成立的因为Java中,对于一些数据类型的“常用数值”采用了缓存策略。自动装箱规范要求boolean、byte,char<=127,介于-128-127之间的short,int都被包装到固定的对象中。这样这种比较就有可能成立。


基本数据类型的equals与==

当基本数据类型与其包装类型进行==判断时,会自动调用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);






















你可能感兴趣的:(D对象包装器与自动装箱 基本数据类型的equals与==)