浅谈java中的自动拆装箱

Java在jdk1.5之后推出的一个新特性:自动拆装箱。 该特性不是jvm认可的,而是编译允许

public class Integerdemo03 {
    public static void main(String[] args) {
        /**
         * 编译器在编译下列代码时补充了代码
         * Integer n= Integer.valueOf(1);
         * 自动装箱
         */
        int a=100;
        Integer n=100;
        Integer m=100;

        包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类的实例所包装的数值来进行比较的。所以下面的代码返回true。
        System.out.println(a==n);//true 

        Integer有一个静态方法valueOf(int i),当自动装箱触发时,编译器会自动补充调用该方法的代码。而通过查看Integer类的源码可知,在static

        静态代码块中,系统把-128-127之间的整数自动装箱成Integer实例,并且缓存在一个名为cache的数组中。当你把一个-128-127之间的

        整数自动装箱成Integer实例时,实际上是直接指向对应的数组元素,因此-128-127之间的相同的整数自动装箱成Integer实例时,永远都

        是引用cache数组中的同一个元素,所以它们全部相等。所以下面的代码返回true。但是如果当valueOf(int i) 中的i不在-128-127的范围之内

        即便是两个值相同的i,自动装箱成Integer实例以后,==比较的结果将会是false。因为如果i不在缓存值范围内,则会new出新的对象,这时即

        使i的值相等,也会new出两个对象,==比较自然是false。    
        System.out.println(m==n);//true

        valueOf()源码如下

         public static Integer valueOf(int i) {
        final int offset = 128;
         if (i >= -128 && i <= 127) { // must cache
           return IntegerCache.cache[i + offset];
        }
           return new Integer(i);
        }     
        /**
         * 编译器在编译下面的代码时
         * 补充了代码:int b=n.intValue();
         */
        int b=n;
        System.out.println(b==a);//true 两个int值比较大小
        System.out.println(b==n);//true 包装类的实例与数值类型进行比较
    }

}

posted @ 2016-03-29 22:31  野生猿  阅读(1951)  评论(0编辑  收藏  举报