关于int和integer(史上最全面,最认真的总结,新鲜出炉,我也标题党一次把)

首先int和integer有是区别,是个人都知道integer是int的封装类,int是java 的一个基本数据类型,是一个关键字。

然后可能还会有人说int默认是0,integer对象默认是null,这有一个前提,那是作为类的成员,如果你在一个方法中出现

int a;

system.out.print(a);编译不通过,a没有初始化。同样的integer也是这样,一定要注意这个前提。

接下里就是最重要的内容了

首先说明一下自动装箱和自动拆箱。

自动装箱:

integer a=7;

在执行这句话的时候其实执行的真正内容是integer a=integer.valueof(7),下面是这个方法

public static Integer valueOf(int i) {
         assert IntegerCache.high >= 127;
         if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

很明显,这里有一个缓存,对于-128到127之间的数会有一个缓存,那么这个时候integer将不会创建新的对象,直接获取现有在缓存中的对象,如果不再这个范围内那么将会new一个integer对象出来。总的来说自动装箱的意思就是integer  a=7这句话不是显示的new一个对象,但是还是要创建为一个对象。

自动拆箱

将一个integre对象转化成int型。例如:

integer a=10;

int b=10;

system.out.print(a==b);//执行a==b的时候,a会有一个自动拆箱的过程,执行a.intvalue()返回一个int值再和b比较,然后就转化成基本数据类型的比较,此时就是值的比较,那么肯定最后的结果就是true。

注意的一点是==两边是基本数据类型,那么就是值的比较,如果是对象类型,那么就是比较对象的地址,这个是之前文章里有写道的。

上面提到的integer的缓存,就是在装箱的时候才会经过,如果直接new一个integer对象,不经过那个缓存的。

其他的包装类的缓存情况如下:

包装器:

  • Boolean:(全部缓存)
  • Byte:(全部缓存)

  • Character(<= 127缓存)
  • Short(-128 — 127缓存)
  • Long(-128 — 127缓存)

  • Float(没有缓存)
  • Doulbe(没有缓存)

那么上面说这么多,就明白了很多见下面例子

    public static void main(String[] args) {
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        //Integer会自动拆箱为int,所以为true
        System.out.println(i == i2);
        System.out.println(i == i3);
        System.out.println("**************");
        Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
        Integer i6 = 127;
        System.out.println(i5 == i6);//true,127在缓存区间,i5,i6是同一个对象
        /*Integer i5 = 128;
        Integer i6 = 128;
        System.out.println(i5 == i6);//false   128不再缓存区间,128就是两个对象
*/        Integer ii5 = new Integer(127);
        System.out.println(i5 == ii5); //false  ii5是直接new一个对象,即使在那个缓存区间里,但是这里直接new,不会经过那个缓存。
    
         Integer a = new Integer(12);
        Integer b = new Integer(12);
        System.out.println(a == b);//false  上面说了,直接new对象,那就是直接创建两个不同的对象。
         Integer i7 = new Integer(128); Integer i8 = new Integer(123); System.out.println(i7 == i8); //false }

猜你喜欢

转载自blog.csdn.net/u010365819/article/details/80459173